Sql Oracle查询使用条件获取特定日期
我有一个价格表,如下所示:Sql Oracle查询使用条件获取特定日期,sql,oracle,Sql,Oracle,我有一个价格表,如下所示: PRODUCT_ID PRICE_DATE 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
PRODUCT_ID PRICE_DATE 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
我想要一些帮助来编写一个查询,为每个记录提取最后的价格日期。例如,在数据行1中,BlueLoton的最后一个价格为7.5,该价格的最后一个生效日期为2018年8月21日
因此,结果集将如下所示:
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
为了帮助理解这个示例,请参阅下面的脚本以构建一个表
create table COMP_RESULTS (product_id varchar2(20), price_date date, product_price number, last_price number);
insert into comp_results values ('BlueLotion',DATE '24 AUG 2018','10','7.5');
insert into comp_results values ('BlueLotion',DATE '23 AUG 2018','10','7.5');
insert into comp_results values ('BlueLotion',DATE '22 AUG 2018','10','7.5');
insert into comp_results values ('BlueLotion',DATE '21 AUG 2018','7.5','6.5');
insert into comp_results values ('BlueLotion',DATE '20 AUG 2018','7.5','6.5');
insert into comp_results values ('BlueLotion',DATE '19 AUG 2018','7.5','6.5');
insert into comp_results values ('BlueLotion',DATE '18 AUG 2018','6.5','7.5');
insert into comp_results values ('BlueLotion',DATE '17 AUG 2018','6.5','7.5');
insert into comp_results values ('BlueLotion',DATE '15 AUG 2018','6.5','7.5');
insert into comp_results values ('BlueLotion',DATE '14 AUG 2018','7.5',NULL);
insert into comp_results values ('BlueLotion',DATE '13 AUG 2018','7.5',NULL);
insert into comp_results values ('BlueLotion',DATE '12 AUG 2018','7.5',NULL);
注意:表中有不同的产品,不仅仅是蓝润肤露 您可以使用相关子查询:
SELECT cr.*,
(SELECT c1.PRICE_DATE
FROM COMP_RESULTS cr1
WHERE cr1.PRODUCT_ID = cr.PRODUCT_ID AND
cr1.PRICE = cr.LAST_PRICE AND cr1.PRICE_DATE < cr.PRICE_DATE
ORDER BY c1.PRICE_DATE DESC
FETCH FIRST 1 ROWS ONLY
) AS DATE_WITH_PREV_RATE
FROM COMP_RESULTS cr;
您可以使用相关子查询:
SELECT cr.*,
(SELECT c1.PRICE_DATE
FROM COMP_RESULTS cr1
WHERE cr1.PRODUCT_ID = cr.PRODUCT_ID AND
cr1.PRICE = cr.LAST_PRICE AND cr1.PRICE_DATE < cr.PRICE_DATE
ORDER BY c1.PRICE_DATE DESC
FETCH FIRST 1 ROWS ONLY
) AS DATE_WITH_PREV_RATE
FROM COMP_RESULTS cr;
您可以尝试使用滞后功能:
您可以尝试使用滞后功能:
虽然这是一个非常好的建议,但只有一个问题-使用子查询将阻止我创建实体化视图。虽然这是一个非常好的建议,但只有一个问题-使用子查询将阻止我创建实体化视图。您是否使用Oracle 12c?从您上次的请求中,我们知道您使用查询来获取以前的价格。在12c中,您可以使用outerapply一次性获得该价格及其日期。日期必须为“2018-08-12”,而不是“2018年8月12日”。价格也有些不正确:“7.5”不是一个数字;7.5是。您是否在使用Oracle 12c?从您上次的请求中,我们知道您使用查询来获取以前的价格。在12c中,您可以使用outerapply一次性获得该价格及其日期。日期必须为“2018-08-12”,而不是“2018年8月12日”。价格也有些不正确:“7.5”不是一个数字;7.5是。