Oracle Query Используйте условия, чтобы получить конкретную дату - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть таблица с ценами, как показано ниже:

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 последняя цена BlueLotion равна 7,5, и эта цена была последней на месте 21/08/2018

Поэтому набор результатов будет выглядеть примерно так:

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);

Примечание. В таблице представлены различные продукты, а не только BlueLotion.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Вы можете попробовать с функцией LAG: https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=a545cab41ec5858e4f54f9220eb8c4f4

 select comp_results.*,lastchangeddate from comp_results 
      inner join
    (select product_id,prev_price,min(case when product_price<>prev_price then price_Date end) as lastchangeddate 
    from 
    (
     select product_id,price_Date, product_price,last_price,
     LAG(product_price, 1, 0) OVER (ORDER BY price_Date desc) as prev_price
     from comp_results)a  where prev_price<>0 group by product_id,prev_price
   )b 
    on comp_results.product_id =b.product_id and 
    comp_results.product_price=b.prev_price
    order by price_Date desc
0 голосов
/ 26 сентября 2018

Вы можете использовать коррелированный подзапрос:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...