Sql 再次运行总计。没有over子句,没有游标,而是递增顺序
我仍然无法根据值的递增顺序创建一个运行总数。行id没有实际意义,它只是PK。我的服务器不支持超过Sql 再次运行总计。没有over子句,没有游标,而是递增顺序,sql,Sql,我仍然无法根据值的递增顺序创建一个运行总数。行id没有实际意义,它只是PK。我的服务器不支持超过 Row Value 1 3 2 7 3 1 4 2 结果: Row Value 3 1 4 3 1 6 2 13 我已经尝试过自连接和交叉连接,其中我指定第二个数量的值(被求和的数量)小于第一个数量的当前值。我也尝试过使用having子句来实现这一点,但当我这样尝试时,总是会出现错误。有人能解释一下为什么以这种方式使用它是错误的,以及我应该如何使用它吗?这里有一种方法可以计算一个连续的总数: s
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
如果使用sql server 2008,则可以使用with rollup命令
select sum(value) from t t2 where t2.value <= t.value with rollup
如果您的平台支持递归queriesIIRC,则应该省略microsoft stuff的递归关键字。因为CTE需要估计链的开始/结束,不幸的是,元组需要以某种方式排序,我使用row字段;内部元组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
;
如果您告诉我们您的服务器是什么,而不是它不支持什么,这会有所帮助。with rollup不是2008年的新功能,也不做运行总计。它与GROUP BY结合使用以给出小计。使用不等式的自联接(也称为三角联接)是获得运行总计的最差方式之一,但考虑到问题所施加的限制,它似乎是唯一剩下的选择。@Simon。是的,我也相信所有数据库供应商都应该支持全套窗口/分析功能。
row | value | runsum
-----+-------+--------
1 | 3 | 3
2 | 7 | 10
3 | 1 | 11
4 | 2 | 13
(4 rows)