You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server:遇到0时重置的累计求和实现

在SQL Server中实现遇0重置的累计求和

这需求挺典型的,要做累计求和但碰到值为0的行就重置计算对吧?我帮你写一个基于窗口函数的解决方案,既高效又易读,完全符合你的预期结果。

首先先明确你的数据和预期:

原始数据集:
pk | price
1 | 10
2 | 15
3 | 0
4 | 10
5 | 5

预期结果:
pk | price | cumulative_sum
1 | 10 | 10
2 | 15 | 25
3 | 0 | 0
4 | 10 | 10
5 | 5 | 15

核心思路是先给数据分组:每遇到一个price=0的行,就创建一个新的分组,这样每个分组内的累计求和就会从0重新开始。然后在每个分组内做常规的累计求和,同时单独处理price=0的行(直接返回0)。

完整SQL代码

假设你的表名为prices,执行以下查询即可:

WITH grouped_prices AS (
    SELECT 
        pk,
        price,
        -- 计算分组ID:从第一行到当前行,统计0的出现次数,作为分组依据
        SUM(CASE WHEN price = 0 THEN 1 ELSE 0 END) OVER (ORDER BY pk) AS reset_group
    FROM prices
)
SELECT 
    pk,
    price,
    -- 分组内累计求和,price为0时直接返回0
    CASE 
        WHEN price = 0 THEN 0 
        ELSE SUM(price) OVER (PARTITION BY reset_group ORDER BY pk) 
    END AS cumulative_sum
FROM grouped_prices
ORDER BY pk;

代码解释

  1. CTE grouped_prices:

    • 用SUM() OVER (ORDER BY pk)窗口函数计算reset_group:每遇到一个price=0的行,这个值就会加1,这样后续的行就会被分到新的分组里,实现“遇0重置”的分组逻辑。
    • 比如你的数据中,pk1和pk2的reset_group是0,pk3到pk5的reset_group是1。
  2. 主查询:

    • 对每个reset_group内的行按pk排序,用SUM() OVER (PARTITION BY reset_group ORDER BY pk)做累计求和。
    • 加一个CASE判断:如果当前行的price是0,直接返回0(和预期结果一致),否则返回分组内的累计值。

测试验证

用你的原始数据测试,这个查询会完美输出你想要的结果。如果遇到连续多个0的情况(比如pk3和pk4都是0),每个0行的累计值都会是0,下一个非0行会重新开始累计,逻辑依然成立。

内容的提问来源于stack exchange,提问作者Maxime Lgv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:13:23