Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle查询使用条件获取特定日期_Sql_Oracle - Fatal编程技术网

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是。