我仍然无法根据值的递增顺序创建运行总计。Row id 没有实际意义,它只是PK。我的服务器不支持OVER。
Row Value
1 3
2 7
3 1
4 2
结果:
Row Value
3 1
4 3
1 6
2 13
我已经尝试过自我连接和交叉连接,我指定第二个数量的值(被总结的那个)小于第一个的当前值。我也尝试过使用 having 子句来执行此操作,但是当我以这种方式尝试时总是会引发错误。有人可以解释为什么以这种方式使用它是错误的以及我应该怎么做?
我仍然无法根据值的递增顺序创建运行总计。Row id 没有实际意义,它只是PK。我的服务器不支持OVER。
Row Value
1 3
2 7
3 1
4 2
结果:
Row Value
3 1
4 3
1 6
2 13
我已经尝试过自我连接和交叉连接,我指定第二个数量的值(被总结的那个)小于第一个的当前值。我也尝试过使用 having 子句来执行此操作,但是当我以这种方式尝试时总是会引发错误。有人可以解释为什么以这种方式使用它是错误的以及我应该怎么做?
以下是计算总和的一种方法:
select row, value,
(select sum(value) from t t2 where t2.value <= t.value) as runningTotal
from t
如果你的平台支持递归查询(IIRC 你应该省略微软东西的 RECURSIVE 关键字)。因为 CTE 需要估计“链”的开始/结束,不幸的是,元组需要以某种方式排序(我使用“行”字段;内部 tuple-id 非常适合此目的):
WITH RECURSIVE sums AS (
-- Terminal part
SELECT d0.row
, d0.value AS value
, d0.value AS runsum
FROM data d0
WHERE NOT EXISTS (
SELECT * FROM data nx
WHERE nx.row < d0.row
)
UNION
-- Recursive part
SELECT t1.row AS row
, t1.value AS value
, t0.runsum + t1.value AS runsum
FROM data t1
, sums t0
WHERE t1.row > t0.row
AND NOT EXISTS (
SELECT * FROM data nx
WHERE nx.row > t0.row
AND nx.row < t1.row
)
)
SELECT * FROM sums
;
结果:
row | value | runsum
-----+-------+--------
1 | 3 | 3
2 | 7 | 10
3 | 1 | 11
4 | 2 | 13
(4 rows)
如果你有 sql server 2008,你可以使用 with rollup 命令。
select sum(value) from t t2 where t2.value <= t.value with rollup