Oracle SQL:按分组实现时间维度的累计求和问题
问题根源
你的查询未实现分组独立累计的核心原因是:窗口函数缺少PARTITION BY子句,当前的OVER(ORDER BY ...)会对所有数据做全局累计,而非按每个分组单独计算。
正确查询语句
要实现每个分组按时间维度的累计求和,需先按月份+分组聚合当月金额,再通过PARTITION BY "group"将数据按分组拆分后做累计:
SELECT month, SUM(month_amount) OVER (PARTITION BY "group" ORDER BY month) AS sum_amount, "group" FROM ( -- 子查询:计算每个月每个分组的当月金额总和 SELECT TO_CHAR(date, 'YYYY-MM') AS month, "group", SUM(amount) AS month_amount FROM your_table GROUP BY TO_CHAR(date, 'YYYY-MM'), "group" ) AS monthly_grouped ORDER BY month, "group";
逻辑说明
- 子查询阶段:先聚合得到每个月份、每个分组的当月金额总和(比如2022-2的g1当月总和是3+4=7,g2是1)
- 窗口函数阶段:通过
PARTITION BY "group"将数据按分组隔离,再按月份排序做累计:- g1的2022-2累计值 = 2022-1的2 + 2022-2的7 = 9
- g2的2022-2累计值 = 2022-1的5 + 2022-2的1 = 6
- g3仅2022-3有数据,累计值为当月的2
注意事项
group是SQL保留关键字,作为字段名时必须用双引号(PostgreSQL)或反引号(MySQL)包裹,避免语法报错- 若
date是日期类型,建议用DATE_TRUNC('month', date)替代字符串转换,获取月份的效率更高且更可靠
内容的提问来源于stack exchange,提问作者Froddy
相关产品推荐
相关产品推荐

