You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 20:07:45