问题描述
我正在尝试通过复制以下Excel公式来放置信息以标识GROUP ID:
IF(OR(A2<>A1,AND(B2<>"000",B1="000")),D1+1,D1)
当我的光标位于“ D2”时,将编写此公式,这意味着我已经引用了前一行中新添加的列值以生成当前值。
我希望使用Db2 SQL做到这一点,但是我不确定该怎么做,因为我需要在要添加并引用其值的列上执行LAG函数。
请告知是否有更好的方法。
谢谢。
解决方法
假设ORDER BY SERIAL_NUMBER,EVENT_TIMESTAMP
返回Excel中显示的顺序,您需要嵌套的OLAP函数:
with cte as
(
select ...
case --IF(OR(A2<>A1,AND(B2<>"000",B1="000"))
when (lag(OPERATION)
over (order by SERIAL_NUMBER,EVENT_TIMESTAMP) = '000'
and OPERATION <> '000')
or lag(SERIAL_NUMBER,1,'')
over (order by SERIAL_NUMBER,EVENT_TIMESTAMP) <> SERIAL_NUMBER
then 1
else 0
end as flag -- start of new group
from tab
)
select ...
sum(flag)
over (order by SERIAL_NUMBER,EVENT_TIMESTAMP
rows unbounded preceding) as GROUP_ID
from cte
,
您的代码正在计算数据中的“中断”数,其中“中断”定义为000
或第一列中的值正在更改。
在SQL中,您可以将其作为累积总和:
select t.*,sum(case when prev_serial_number = serial_number or operation <> '000'
then 0 else 1
end) over (order by event_timestamp rows between unbounded preceding and current row) as column_d
from (select t.*,lag(serial_number) over (order by event_timestamp) as prev_serial_number
from t
) t