我有一个要求,从 Col_Value
基于上一个 Col_Date
(基于列上的逻辑分区) Col_1,Col_2,Col_3,Col_4
). 当当前行有值时,不能结转使用当前值,也不能从上一日期结转。如果当前行和前一日期中没有值,则应使用最近的结转值。
这是我的输入表。
下面是我迄今为止尝试的sql。
select *,
case
when col_value is null
then lag(Col_Value) over (PARTITION BY Col_1,Col_2,Col_3,Col_4 order by Col_Date)
else col_value
end as Carry_Fowrard_Value
from carry_table
我用了 lag
分析功能,并能够得到以下结果的基础上,我分享了上面的sql。但是对于突出显示的行,我得到了null,因为上一个日期没有值。如何根据上次可用值结转价值?
下面是预期输出。
非常感谢您的帮助。
2条答案
按热度按时间wn9m85ua1#
配置单元支持忽略
NULL
上的值FIRST_VALUE()
以及LAST_VALUES()
. 唉,它不支持这一点LAG()
,但您可以使用LAST_VALUE()
:这应该完全满足您的需要,而不需要子查询。
注意:配置单元语法是非标准的。标准语法是
IGNORE NULLS
,而不是第二个论点。5q4ezhmt2#
尝试以下操作-首先计算
NULL
值,然后用它填充这些空值max()
分区中的值。这是postgresql中的演示,但也可以在hive中使用。
输出: