SQL查询求助:按行顺序实现ID值的累计求和输出
按原始行顺序实现累计求和的SQL解决方案
嘿,我明白你的问题了——你想要的是按照数据在表中的原始行顺序来累加ID值,但之前的查询错误地用了ID字段来关联,导致排序逻辑不对,结果自然不符合预期。
首先得明确一个关键点:SQL表本身是无序的,没有所谓的“天然行顺序”,除非你有一个能标识插入顺序的字段(比如自增ID、创建时间戳)。所以第一步我们需要先给每行数据生成一个能代表顺序的序号,再基于这个序号做累计求和。
解决方案步骤
1. 先给数据添加行号(如果没有天然顺序字段)
如果你的表T1没有类似自增列的顺序标识,我们可以用ROW_NUMBER()函数给每行生成一个按SQL引擎返回的原始顺序的序号:
SELECT Name, ID, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNum -- 用(SELECT NULL)表示按原始返回顺序,有其他逻辑可替换 INTO #TempT1 -- 临时表存储带行号的数据 FROM T1;
2. 基于行号实现累计求和
接下来用窗口函数SUM() OVER()来按行号顺序累加,这比你之前用的CROSS APPLY更高效简洁:
SELECT Name, ID, SUM(ID) OVER (ORDER BY RowNum) AS Output FROM #TempT1 ORDER BY RowNum; -- 确保输出顺序和原始行一致
如果你已经有自增顺序字段(比如叫RowID)
如果你的表本身就有一个自增列(比如创建数据时自动生成的RowID),那可以直接用这个字段,不需要临时表:
SELECT Name, ID, SUM(ID) OVER (ORDER BY RowID) AS Output FROM T1 ORDER BY RowID;
为什么你的原始查询不对?
你之前的CROSS APPLY里用WHERE t1.ID <= t.ID,这是按ID字段的数值大小来累加,而不是按行的先后顺序。比如你的数据里E -1的ID是-1,比前面很多ID都小,所以会把所有ID<= -1的行加起来,这显然不是你要的逻辑。
验证结果
用上面的方案,你会得到完全符合预期的输出:
Name ID Output
A 1 1
A -1 0
B 2 2
C 3 5
C 4 9
E -1 8
内容的提问来源于stack exchange,提问作者som_1522
相关产品推荐
相关产品推荐

