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

PostgreSQL按条件计算cumsum:按id分组对type='end'行求累计求和问题

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

常见错误原因

大部分实现出错的核心原因有两类:

  1. 先过滤type="end"的行再计算累计求和,导致结果无法匹配原表所有行,丢失非end类型的行数据
  2. 计算累计求和时未严格按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:12:00