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

利用Partition by函数为插入数据添加分组累计求和列

如何按FK_Key分组更新累计求和的Total列

针对你需要在插入数据后,按FK_Key分组计算Score的累计值来更新Total列的需求,这里有个简洁高效的解决方案,能确保每个分组的累计值独立计算,不会和其他组混淆。

需求回顾

  • 初始数据中Total列为NULL,需要按FK_Key分组,计算到当前行为止的Score累计值来填充Total
  • 插入同FK_Key的新数据后,重新执行更新语句能自动更新所有对应行的累计值

解决方案:使用窗口函数+CTE更新

我们可以借助SQL的窗口函数SUM() OVER()来实现分组累计求和,再通过CTE(公共表表达式)来更新原表:

WITH CTE_累计值 AS (
    SELECT 
        FK_Key,
        Score,
        Total,
        -- 按FK_Key分组,累计计算Score的和
        SUM(Score) OVER (PARTITION BY FK_Key ORDER BY (SELECT NULL)) AS 计算累计值
    FROM #Table1
)
UPDATE CTE_累计值
SET Total = 计算累计值;

代码解释

  • PARTITION BY FK_Key:确保每个FK_Key分组独立计算累计值,不同分组之间不会互相影响
  • ORDER BY (SELECT NULL):由于你没有指定数据的排序规则,这里会按照数据的插入顺序(存储顺序)来累计求和。如果后续需要按特定字段排序(比如新增的ID、时间字段),可以将(SELECT NULL)替换为对应的字段(例如ORDER BY ID)

完整测试流程

将以下代码完整执行,就能得到你期望的结果:

IF OBJECT_ID('tempdb..#Table1') IS NOT NULL DROP TABLE #Table1 
GO 
CREATE TABLE #Table1 ( 
    FK_Key INT, 
    Score INT NULL, 
    Total INT NULL, 
) 
INSERT INTO #Table1 VALUES (121, 1, NULL), (121, 5, NULL), (121, 7, NULL), (121, 6, NULL)

-- 执行更新语句
WITH CTE_累计值 AS (
    SELECT 
        FK_Key,
        Score,
        Total,
        SUM(Score) OVER (PARTITION BY FK_Key ORDER BY (SELECT NULL)) AS 计算累计值
    FROM #Table1
)
UPDATE CTE_累计值
SET Total = 计算累计值;

-- 查询更新后的结果
SELECT * FROM #Table1

执行结果

执行后你会得到如下结果:

FK_KeyScoreTotal
12111
12156
121713
121619

后续扩展

如果之后插入新的同FK_Key数据(例如(121, 3, NULL)),只需要再次执行上述的CTE更新语句,就能自动将该行的Total更新为22,同时不影响其他FK_Key分组的数据。

内容的提问来源于stack exchange,提问作者user3920526

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:22:14