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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...