如何解决具有多个条件的 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 举报,一经查实,本站将立刻删除。