如何解决Db2 LAG功能可以引用自身吗?
我正在尝试通过复制以下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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。