Oracle 查询:选择列中数据的最后更改

2024-01-28

我有一个包含以下列的表:

产品_ID 定价_日期 当前_价格 最后_定价_日期

我正在尝试编写一个查询,显示产品更改为当前价格之前的旧价格(Last_Price),以便我的结果如下所示

PRODUCT_ID  PRICE_DATE  PRODUCT_PRICE LAST_PRICE
BlueLotion  24/08/2018   £10.00        £7.50
BlueLotion  23/08/2018   £10.00        £7.50
BlueLotion  22/08/2018   £10.00        £7.50
BlueLotion  21/08/2018   £7.50         £6.50 
BlueLotion  20/08/2018   £7.50         £6.50 
BlueLotion  19/08/2018   £7.50         £6.50
BlueLotion  17/08/2018   £6.50         £7.50
BlueLotion  16/08/2018   £6.50         £7.50
BlueLotion  13/08/2018   £6.50         £7.50
BlueLotion  12/08/2018   £7.50          NULL
BlueLotion  11/08/2018   £7.50          NULL
BlueLotion  10/08/2018   £7.50          NULL

有效地选择更改之前数据的价值。 一些要测试的资源 - 您可以使用脚本快速创建表:

create table COMP_RESULTS (product_id varchar2(20), price_date date, product_price number);

insert into comp_results values ('BlueLotion','24 AUG 2018','10');
insert into comp_results values ('BlueLotion','23 AUG 2018','10');
insert into comp_results values ('BlueLotion','22 AUG 2018','10');
insert into comp_results values ('BlueLotion','21 AUG 2018','7.5');
insert into comp_results values ('BlueLotion','20 AUG 2018','7.5');
insert into comp_results values ('BlueLotion','19 AUG 2018','7.5');
insert into comp_results values ('BlueLotion','18 AUG 2018','6.5');
insert into comp_results values ('BlueLotion','17 AUG 2018','6.5');
insert into comp_results values ('BlueLotion','16 AUG 2018','6.5');
insert into comp_results values ('BlueLotion','15 AUG 2018','7.5');
insert into comp_results values ('BlueLotion','14 AUG 2018','7.5');
insert into comp_results values ('BlueLotion','13 AUG 2018','7.5');

对不起大家,我可以添加一个复杂的情况吗?我还需要在结果表中添加一列,显示 Last_Date_With_Prev_Price 因此,最终结果集将是

PRODUCT_ID  PRICE_DATE  PRICE  LAST_PRICE  DATE_WITH_PREV_RATE
BlueLotion  24/08/2018  £10.00  £7.50       21/08/2018
BlueLotion  23/08/2018  £10.00  £7.50       21/08/2018
BlueLotion  22/08/2018  £10.00  £7.50       21/08/2018
BlueLotion  21/08/2018  £7.50   £6.50       17/08/2018
BlueLotion  20/08/2018  £7.50   £6.50       17/08/2018
BlueLotion  19/08/2018  £7.50   £6.50       17/08/2018
BlueLotion  17/08/2018  £6.50   £7.50       12/08/2018
BlueLotion  16/08/2018  £6.50   £7.50       12/08/2018
BlueLotion  13/08/2018  £6.50   £7.50       12/08/2018
BlueLotion  12/08/2018  £7.50   NULL        NULL
BlueLotion  11/08/2018  £7.50   NULL        NULL
BlueLotion  10/08/2018  £7.50   NULL        NULL

这很棘手,因为你的价格会上下波动。您可以使用lag(ignore nulls)。首先,找出价格变化的时间。然后获取之前的价格。所以:

select cr.*,
       (case when prev_current_price <> current_price
             then prev_current_price  -- use the previous price when it changes
             else  -- lag to the previous change
                  lag( (case when prev_current_price <> current_price then prev_current_price
                        end) ignore nulls
                      ) over (partition by cr.product_id
                              order by cr.price_date
                             )
        end) as prev_price
from (select cr.*,
             lag(cr.current_price) over (partition by cr.product_id order by cr.price_date) as prev_current_price
      from comp_results cr
     ) cr;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle 查询:选择列中数据的最后更改 的相关文章

随机推荐

  • 如何在cypress中重复操作并获取每个操作的结果

    我正在尝试重复 cypress 中定义的某个操作doTheAction然后得到这些重复动作的结果 当我尝试 Promise all 时 它立即解析为未定义的数组 describe some test gt it for each gt co
  • 如何将变量移入或移出类似于 MATLAB 中的 LOAD 和 SAVE 的结构?

    是否有一种快速方法 即一行 来转储结构 中 的变量集合 使用变量名称作为结构字段 加载 函数基本上就是这样做的 但是保存和加载到临时文件看起来很丑陋 例如 clear a adsf b rand 10 x var2struct a b x
  • Windows GUI自动化[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • SimpleStringProperty set() 与 setValue()

    有什么区别set String and setValue String in the SimpleStringProperty http docs oracle com javafx 2 api javafx beans property
  • Boost Fusion:在编译时验证调整后的结构成员排序

    我在用着BOOST FUSION ADAPT STRUCT 我需要检查所有成员是否已声明且顺序正确 所以首先我这样做了 template
  • 根据存储的时区修改 ASP.NET MVC C# 中的日期

    我的问题有两个方面 1 我正在编写一个论坛 但我无法弄清楚如何为论坛用户存储时区 他们将能够设置自己的时区并相应修改论坛上的所有日期 我是否必须创建一个包含时区名称和调整服务器时间的数字的数据库表 NET 是否内置了时区支持 2 一旦我弄清
  • Android Studio:具有两个以上风味维度(风味组)的产品风味组合

    我正在使用 Android Studio v 2 1 gradle 插件 v 2 1 0 开发 Android 应用程序 我的应用程序有各种版本 它们共享许多通用代码 因此我决定使用风格维度和产品风格来在需要时和地点自定义代码和资源 只要我
  • 如何在 R 中获取机器 epsilon?

    R 中是否有一个常量存储机器 epsilon Try Machine double eps and Machine在我的 32 位 Linux 机器上会产生以下结果 R gt Machine double eps 1 2 220e 16 d
  • WebClient.DownloadStringAsync 在 Silverlight 中抛出安全异常

    第一次使用Silverlight 遵循在线教程 我正在创建一个应用程序 允许用户使用 WebClient 从 Digg 网站搜索故事 并将它们显示在 Silverlight 控件的数据网格中 这是代码 private void btnSea
  • 如何将标识符(`proc_macro::Ident`)存储为常量以避免重复?

    我正在编写一个程序宏 我需要多次发出一个非常长的标识符 可能因为卫生 https stackoverflow com q 59618213 2408867 例如 我用quote 创造TokenStreams 但我不想一遍又一遍地重复长标识符
  • 如何获取ConcurrentDictionary的即时快照?

    MSDN https msdn microsoft com en us library dd287131 aspx表明枚举器从返回ConcurrentDictionary并不代表某个时刻的快照ConcurrentDictionary 虽然在
  • 片段中的片段

    我想知道这是否真的是 Android API 中的一个错误 我有这样的设置 1 2 3 是一个在右窗格中加载片段 2 搜索屏幕 的菜单 是一个搜索屏幕 其中包含片段 3 它是一个结果列表 结果列表在多个地方使用 包括作为其本身的功能高级片段
  • ggplot 2.0.0 中的点大小

    自从我更新到 ggplot 版本 2 0 0 后 我在重新创建绘图时遇到了麻烦 似乎我无法像以前那样减少点大小 这是具有很多点的绘图中的一个问题 在下面的示例中 plot1 和plot2 之间的点大小存在合理的差异 plot3 中的点大小至
  • Python-从长度不等的列表中获取所有唯一的组合并进行替换

    注意 这不是标题可能说的重复问题 如果我有一个 list 列表 我需要通过替换从中获取所有组合 import itertools l 1 2 3 1 2 3 1 2 3 n for i in itertools product l if s
  • sqlite 中出现“TYPE_FORWARD_ONLY”错误

    我正在使用 SQLite 和 JDBC 并收到有关 result set 为 TYPE FORWARD ONLY 的错误 PreparedStatement get mileage conn prepareStatement SELECT
  • PHP 中的多线程/多任务

    在 PHP 中 我们通常在编码时不考虑服务器的功能 如今 甚至 PC 也拥有多个内核并处理 64 位数据 据我所知 PHP 引擎本身已针对利用多核进行了优化 我们程序员如何进一步优化代码以利用多核 换句话说 我想知道教我编写代码的技术 这些
  • 有没有办法检查 Android 上是否启用了“从未知来源安装”?

    如果未启用此选项 我想提示用户 这是检查此设置的另一种方法 boolean isNonPlayAppAllowed Settings Secure getInt getContentResolver Settings Secure INST
  • 我可以从 aws s3 恢复下载吗?

    我正在使用 python boto3 库通过蜂窝连接将文件从 s3 下载到物联网设备 该连接通常缓慢且不稳定 有些文件非常大 250Mb 对于这种情况来说很大 并且在下载时网络出现故障并且设备重新启动 我想从设备重新启动时结束的位置恢复下载
  • 使用http响应如何保存pdf文件

    我编写了以下代码来从网页获取内容并将其保存到系统 如果网页是 html 格式 我可以保存它 如果网页是 pdf 格式 我无法保存它 保存后 如果我打开文件 就会出现空白页 我想知道如何保存回复中的 pdf 文件 HttpWebRequest
  • Oracle 查询:选择列中数据的最后更改

    我有一个包含以下列的表 产品 ID 定价 日期 当前 价格 最后 定价 日期 我正在尝试编写一个查询 显示产品更改为当前价格之前的旧价格 Last Price 以便我的结果如下所示 PRODUCT ID PRICE DATE PRODUCT