Sql 再次运行总计。没有over子句,没有游标,而是递增顺序

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

我仍然无法根据值的递增顺序创建一个运行总数。行id没有实际意义,它只是PK。我的服务器不支持超过

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)