SQL 多个条件的累计和

SQL cumulative sum with mutilple conditions

我的输入 table 是这样的:

date    ID    Flag 
01.01    A     0
01.02    A     0
01.03    A     1
01.04    A     1 
01.05    A     1
01.06    A     0
01.07    A     1
01.08    A     1
01.09    A     0
01.01    B     1
01.02    B     0
01.03    B     1
01.04    B     1 
01.05    B     1
01.06    B     1
01.07    B     1
01.08    B     0
01.09    B     0

我想计算每个flag的累加和,但是如果flag再次等于0需要刷新计算

所以,输出 table 应该是:

date    ID    Flag   CUMSUM
01.01    A     0        0
01.02    A     0        0
01.03    A     1        1
01.04    A     1        2
01.05    A     1        3
01.06    A     0        0
01.07    A     1        1
01.08    A     1        2
01.09    A     0        0
01.01    B     1        1
01.02    B     0        0
01.03    B     1        1
01.04    B     1        2
01.05    B     1        3
01.06    B     1        4
01.07    B     1        5
01.08    B     0        0
01.09    B     0        0

那么,有什么解决这个问题的建议吗? 我试过这个:

sum(FLAG) over (partition by ID order by date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)

但我不知道如何“刷新”累积计算,知道吗?

提前致谢!

您需要分配一个分组。分组是每行前0的个数。然后使用它进行分区:

select t.*,
       (case when flag = 1
             then sum(flag) over (partition by id, grp order by date)
             else 0
        end) as cumulative_sum
from (select t.*,
             sum(case when flag = 0 then 1 else 0 end) over (partition by id order by date) as grp
      from t
     ) t;

注意:假设日期是唯一的(如示例数据中所示),则不需要 window 框架规范 (rows between . . .)。所以,我就把它留下了。

另外,可以将子查询中的计算简化为:

sum(1 - flag = 0) over (partition by id order by date) as grp