SQL Server - Cumulative Sum that resets when 0 is encountered(SQL Server - 遇到 0 时重置的累积和)
问题描述
我想对一列进行累积求和,但每当遇到 0 时重置聚合值
I would like to do a cumulative sum on a column, but reset the aggregated value whenever a 0 is encountered
这是我尝试做的一个例子:
Here is an example of what i try to do :
这个数据集:
pk price
1 10
2 15
3 0
4 10
5 5
给出这个:
pk price
1 10
2 25
3 0
4 10
5 15
推荐答案
在 SQL Server 2008 中,您受到严重限制,因为您无法使用分析函数.以下方法效率不高,但可以解决您的问题:
In SQL Server 2008, you are severely limited because you cannot use analytic functions. The following is not efficient, but it will solve your problem:
with tg as (
select t.*, g.grp
from t cross apply
(select count(*) as grp
from t t2
where t2.pk <= t.pk and t2.pk = 0
) g
)
select tg.*, p.running_price
from tg cross apply
(select sum(tg2.price) as running_price
from tg tg2
where tg2.grp = tg.grp and tg2.pk <= tg.pk
) p;
唉,在 SQL Server 2012 之前,最有效的解决方案可能涉及游标.在 SQL Server 2012+ 中,您只需执行以下操作:
Alas, prior to SQL Server 2012, the most efficient solution might involve cursors. In SQL Server 2012+, you simply do:
select t.*,
sum(price) over (partition by grp order by pk) as running_price
from (select t.*,
sum(case when price = 0 then 1 else 0 end) over (order by pk) as grp
from t
) t;
这篇关于SQL Server - 遇到 0 时重置的累积和的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:SQL Server - 遇到 0 时重置的累积和


基础教程推荐
- while 在触发器内循环以遍历 sql 中表的所有列 2022-01-01
- CHECKSUM 和 CHECKSUM_AGG:算法是什么? 2021-01-01
- MySQL根据从其他列分组的值,对两列之间的值进行求和 2022-01-01
- 使用 VBS 和注册表来确定安装了哪个版本和 32 位 2021-01-01
- 如何在 CakePHP 3 中实现 INSERT ON DUPLICATE KEY UPDATE aka upsert? 2021-01-01
- 从字符串 TSQL 中获取数字 2021-01-01
- 带更新的 sqlite CTE 2022-01-01
- 带有WHERE子句的LAG()函数 2022-01-01
- ORA-01830:日期格式图片在转换整个输入字符串之前结束/选择日期查询的总和 2021-01-01
- MySQL 5.7参照时间戳生成日期列 2022-01-01