如何在SQL表中返回带有列条件的前一行值?

时间:2019-04-17 11:00:58

标签: sql case impala

我有下面的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 个答案:

答案 0 :(得分:2)

您可以使用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;

编辑:

我误解了这个问题。我以为您想要最新的数据。您需要“正在运行”的最新值。

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 :(得分:1)

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;