使用sum() over(partition by)逐行计算值获取账户期末余额问题求助
SQL计算账户期末余额问题解决方案
错误原因
- 你编写的查询混用了
GROUP BY分组聚合与窗口函数,逻辑冲突:GROUP BY account_id会将同账号的所有行合并为1行结果,而窗口函数默认会在每一行都返回对应分区的聚合结果,二者搭配没有意义,还会导致语法报错或结果不符合预期。 - 你需求中的期末余额本质是每个
account_id下所有change字段的累加和,用普通分组聚合即可实现,无需使用窗口函数。
正确实现方式
方案1:普通分组聚合(推荐,性能更优)
直接按账号分组求和即可得到每个账号的期末余额:
SELECT account_id, SUM(change) AS 期末余额 FROM TableX GROUP BY account_id;
方案2:窗口函数实现
如果需要保留原表所有行的同时展示对应账号的期末余额,去掉GROUP BY即可:
SELECT *, SUM(change) OVER(PARTITION BY account_id) AS 期末余额 FROM TableX;
如果仅需要每个账号一行期末余额结果,使用窗口函数时增加去重逻辑即可:
SELECT DISTINCT account_id, SUM(change) OVER(PARTITION BY account_id) AS 期末余额 FROM TableX;
内容的提问来源于stack exchange,提问作者AATU
相关产品推荐
相关产品推荐

