() 但没有成功)
我有一个包含事件的表(比如X,Y,Z是随机事件,A,B是我想跟踪的事件)。如果我找到事件 A,我想在当前和后续行上输出 1,如果我找到 B,我在当前和后续行上输出 -1,在找到其中任何行(A 或 B)之前,我输出 0。如何使用 Hive (SQL) 执行此操作?
event | output | ordercol
X 0 1
Y 0 2
Z 0 3
B -1 4
X -1 5
X -1 6
B -1 7
X -1 8
A 1 9
X 1 10
B -1 11
Z -1 12
我知道这可以使用连接来完成,但我正在寻找一个更优雅的解决方案(也许使用窗口函数 - 我已经尝试了 dense_rank() 和 row_count
根据本文档,您可以使用first_value()
和一些附加逻辑:
select event,
(case first_value(case when event in ('A', 'B') then event end, true) over
(order by ordercol desc)
when 'A' then -1
when 'B' then 1
else 0
end)
from e;
此功能在标准和其他数据库中称为IGNORE NULLS
。