PostgreSQL按条件计算cumsum:按id分组对type='end'行求累计求和问题
问题说明
- 现有输入表结构如下:

- 需求:按
id字段分组,对所有type="end"的行的数值做累计求和(cumsum),当前实现存在问题,需要排查问题原因及获取正确实现方案。 - 预期输出参考:

常见问题排查及正确实现
常见错误原因
大部分实现出错的核心原因有两类:
- 先过滤
type="end"的行再计算累计求和,导致结果无法匹配原表所有行,丢失非end类型的行数据 - 计算累计求和时未严格按
id分组,或未指定行的排序规则,导致累计顺序不符合业务预期、跨id计算结果错误
正确实现代码
Pandas实现
import pandas as pd # df为输入数据表 # 仅对type为end的行按id分组计算累计和,非end行对应位置默认填充NaN df["end_cumsum"] = df[df["type"] == "end"].groupby("id")["value"].cumsum() # 如果需要将非end行的累计和字段填充为0,可补充以下代码 # df["end_cumsum"] = df["end_cumsum"].fillna(0)
SQL实现(MySQL8.0+/PostgreSQL等支持窗口函数的数据库)
SELECT id, type, value, SUM(CASE WHEN type = 'end' THEN value ELSE 0 END) OVER( PARTITION BY id ORDER BY 你的排序字段 -- 必须替换为表中能明确行顺序的字段,比如自增ID、时间戳 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS end_cumsum FROM 你的表名;
内容的提问来源于stack exchange,提问作者user15920209
相关产品推荐
相关产品推荐

