Db2 LAG功能可以引用自身吗?

问题描述

我正在尝试通过复制以下Excel公式来放置信息以标识GROUP ID:

IF(OR(A2<>A1,AND(B2<>"000",B1="000")),D1+1,D1)

当我的光标位于“ D2”时,将编写此公式,这意味着我已经引用了前一行中新添加的列值以生成当前值。

我希望使用Db2 sql做到这一点,但是我不确定该怎么做,因为我需要在要添加并引用其值的列上执行LAG函数

enter image description here

请告知是否有更好的方法

谢谢。

解决方法

假设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