我有下面的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
非常感谢您的帮助。
答案 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;