利用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_Key | Score | Total |
|---|---|---|
| 121 | 1 | 1 |
| 121 | 5 | 6 |
| 121 | 7 | 13 |
| 121 | 6 | 19 |
后续扩展
如果之后插入新的同FK_Key数据(例如(121, 3, NULL)),只需要再次执行上述的CTE更新语句,就能自动将该行的Total更新为22,同时不影响其他FK_Key分组的数据。
内容的提问来源于stack exchange,提问作者user3920526
相关产品推荐
相关产品推荐

