如何在SQL查询中引用上一行值生成计算结果列?
实现SQL中累计计算result列的查询语句
你可以通过窗口函数+空值处理来实现这个需求,不需要手动引用上一行的值。以下是修改后的查询语句:
SELECT ID, date, val1, val2, -- 计算累计变动值,再结合首行初始值得到result 12000 + SUM(COALESCE(val1, 0) - COALESCE(val2, 0)) OVER (ORDER BY ID) - (COALESCE(val1, 0) - COALESCE(val2, 0)) AS result FROM Table ORDER BY ID;
逻辑说明:
- 空值处理:用
COALESCE(val1, 0)把val1的NULL转为0,同理COALESCE(val2, 0)处理val2的NULL,避免计算因NULL报错。 - 累计变动计算:
SUM(...) OVER (ORDER BY ID)会按ID顺序,累计计算从第一行到当前行的(val1 - val2)总和。 - 首行调整:首行result需要固定为12000,而累计总和里首行的变动值是
12000-0=12000,用12000 + 累计总和 - 首行变动值,刚好让首行result等于12000,后续行自动继承累计逻辑。
如果你的SQL支持ROWS BETWEEN语法,也可以用更直观的写法:
SELECT ID, date, val1, val2, CASE WHEN ID = 1 THEN 12000 ELSE 12000 + SUM(COALESCE(val1, 0) - COALESCE(val2, 0)) OVER (ORDER BY ID ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) END AS result FROM Table ORDER BY ID;
验证结果:
代入你提供的输入数据,两种写法都会生成期望的输出:
| ID | date | val1 | val2 | result |
|---|---|---|---|---|
| 1 | 2022-01-11 | 12000 | NULL | 12000 |
| 2 | 2022-02-11 | 500 | NULL | 12500 |
| 3 | 2022-02-11 | NULL | 200 | 12300 |
| 4 | 2022-03-11 | NULL | 400 | 11900 |
内容的提问来源于stack exchange,提问作者Suiseidl
相关产品推荐
相关产品推荐

