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

MySQL 8中使用窗口函数计算UNION查询余额结果错误的问题排查与解决

MySQL 8中使用窗口函数计算UNION查询余额结果错误的问题排查与解决

你好呀,看了你的问题和测试数据,我立刻就找到问题根源啦!

问题原因分析

你当前使用的窗口子句ROWS BETWEEN 1 PRECEDING AND CURRENT ROW,作用是仅计算当前行与前一行的credit - debit之和,这和你想要的「从第一行开始累计到当前行的滚动余额」逻辑完全不符。

举个例子:第三行(table2中id=2的记录),你的SQL计算的是(0-100) + (0-50) = -150,但正确的累计应该是前面所有行的总和:100 - 50 - 100 = -50,这就是余额结果错误的核心原因。

解决方案

要实现「上一行余额 + 当前行credit - 当前行debit」的滚动累计逻辑,我们需要把窗口范围设置为从数据集的第一行到当前行。在MySQL中,当窗口函数指定ORDER BY时,默认的窗口范围就是ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW,所以我们可以直接省略这个子句,或者显式写出。

正确的SQL代码如下:

SELECT 
    id, 
    credit, 
    debit, 
    company, 
    SUM(credit - debit) OVER (ORDER BY id) AS balance 
FROM (
    SELECT id, credit, debit, company FROM table1
    UNION ALL
    SELECT id, credit, debit, company  FROM table2
) AS u 
WHERE company = 1
ORDER BY id;

验证结果

执行上述SQL后,得到的balance列会和你手动标注的「Correct Balance」完全一致:

IdCreditDebitCompanyBalance
110001100
1050150
201001-50
220001150
30501100
410001200
75001250
80200150

额外注意事项

UNION ALL合并后的数据集,在未指定ORDER BY时顺序是不确定的,所以一定要在窗口函数的OVER子句中加上ORDER BY id,确保累计计算是按照id的顺序进行的,这是保证结果正确的关键。

备注:内容来源于stack exchange,提问作者Mehran Ishanian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 13:12:36