微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有多个条件的 SQL 累积总和

如何解决具有多个条件的 SQL 累积总和

我有一个输入表:

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

我想计算每个标志的累计和,但如果标志再次等于0,则应刷新计算。

所以,输出表应该是:

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;

注意:假设日期是唯一的(如在您的示例数据中),则不需要窗口框架规范 (rows between . . .)。所以,我只是把它忽略了。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。