按分组使用CASE语句计算累计求和(running sum)SQL运行异常排查
你的SQL存在两个核心问题导致结果不符合预期:
- 第一个SUM的窗口函数语法不完整:你在第一个OVER子句里写了
rows关键字但没有指定窗口范围,属于不规范写法,不同数据库的兼容处理逻辑差异很大,可能会打乱窗口的计算范围。 - 查询没有加全局排序规则:SQL查询默认不保证结果集的返回顺序,你现在看到的结果里id=1的三条记录按14:00、15:00、13:00的顺序排列,会误导你对累计结果的判断,实际按时间排序后,id=1的累计值0(13:00)→1(14:00)→1(15:00)是符合你当前写法的逻辑的。
如果你要实现的是「按id分组,按时间升序计算累计的满足条件总次数」,可以把SQL优化成更简洁的写法,避免多个窗口函数的冗余和语法问题:
select id, color, time, sum( case when question = 1 then 1 when suggestion = 'True' then 1 when proposal = 'True' then 1 else 0 end ) OVER (PARTITION BY id ORDER BY time) as s from `table` order by id, time
如果你的数据存在同一id下多条记录time相同的情况,想要按行顺序逐行累计,可以在窗口函数的ORDER BY后面加上明确的窗口帧定义:
sum(...) OVER (PARTITION BY id ORDER BY time rows between unbounded preceding and current row) as s
运行修正后的查询,得到的有序结果如下:
id color time s 1 blue 13:00 0 1 pink 14:00 1 1 red 15:00 1 2 green 11:00 1 2 orange 15:00 2
内容的提问来源于stack exchange,提问作者user458
相关产品推荐
相关产品推荐

