Как вернуть предыдущее значение строки с условием столбца в таблице SQL? - PullRequest
1 голос
/ 17 апреля 2019

У меня есть таблица SQL ниже, в которой мне нужна самая последняя цена, только когда тип условия равен 00.

Table:
        ProductID ConditionType Date        Price
        00001          01        2018-01-01  4.00 
        00001          01        2018-01-08  5.00   
        00001          00        2018-01-09  4.50  
        00001          01        2018-01-22  6.00  
        00001          00        2018-01-29  3.00  

Я устал использовать функцию задержки, но у меня проблемы с разделами.

select 
ProductID,ConditionType,Date,Price
,
case when conditiontype = 0 then
lag(Price,1) over (partition by ProductID,ConditionType order by Date asc)
else Price 
end as lag
from TABLE
Output from query:
        ProductID ConditionType Date        Price  Lag
        00001          01        2018-01-01  4.00  4.00
        00001          01        2018-01-08  5.00  5.00 
        00001          00        2018-01-09  4.50  null
        00001          01        2018-01-22  6.00  6.00
        00001          00        2018-01-29  3.00  4.50

В идеале мы хотим отозвать последнюю цену, где тип условия равен 01, но у меня возникают проблемы при получении этой работы.

Desired output:
        ProductID ConditionType Date        Price  Lag
        00001          01        2018-01-01  4.00  4.00
        00001          01        2018-01-08  5.00  5.00 
        00001          00        2018-01-09  4.50  5.00
        00001          01        2018-01-22  6.00  6.00
        00001          00        2018-01-29  3.00  6.00

Спасибо заранее за помощь.

Ответы [ 2 ]

2 голосов
/ 17 апреля 2019

Вы можете сделать это, используя first_value() и игнорируя NULL значения:

select t.*,
       first_value(case when conditionType = '00' then price end ignore nulls) over
           (partition by productId
            order by date desc
           ) as most_recent_00_price
from t;

EDIT:

Я неправильно понял вопрос. Я думал, что вы хотели самые последние данные. Вы хотите «текущее» последнее значение.

Самый простой способ в SQL использует lag(ignore nulls), но это не поддерживается Impala. Но вы можете использовать две оконные функции:

select t.*,
       max(case when date = date_00 then price end) over (partition by productId) as most_recent_00_price
from (select t.*,
             max(case when conditionType = '00' then date end) over (partition by productId order by date) as date_00
      from t
     ) t
1 голос
/ 17 апреля 2019

Вам нужно только одно предложение раздела в lag():

select ProductID, ConditionType, Date, Price,
       (case when conditiontype = '00' 
             then lag(Price) over (partition by ProductID order by Date)
             else Price 
        end) as Lag
from TABLE;
...