Kir*_*met 69 mysql sql running-total
我有一个看起来像这样的表:
id count
1 100
2 50
3 10
Run Code Online (Sandbox Code Playgroud)
我想添加一个名为cumulative_sum的新列,因此表格如下所示:
id count cumulative_sum
1 100 100
2 50 150
3 10 160
Run Code Online (Sandbox Code Playgroud)
是否有可以轻松完成此操作的MySQL更新语句?实现这一目标的最佳方法是什么?
OMG*_*ies 100
SELECT t.id,
t.count,
(SELECT SUM(x.count)
FROM TABLE x
WHERE x.id <= t.id) AS cumulative_sum
FROM TABLE t
ORDER BY t.id
Run Code Online (Sandbox Code Playgroud)
SELECT t.id,
t.count,
@running_total := @running_total + t.count AS cumulative_sum
FROM TABLE t
JOIN (SELECT @running_total := 0) r
ORDER BY t.id
Run Code Online (Sandbox Code Playgroud)
注意:
JOIN (SELECT @running_total := 0) r是一个交叉连接,允许变量声明而无需单独的SET命令. r对于任何子查询/派生表/内联视图,MySQL都需要表别名注意事项:
ORDER BY很重要; 它确保顺序与OP匹配,并且可以对更复杂的变量使用产生更大的影响(IE:psuedo ROW_NUMBER/RANK功能,MySQL缺乏)And*_*mar 84
如果性能是个问题,您可以使用MySQL变量:
set @csum := 0;
update YourTable
set cumulative_sum = (@csum := @csum + count)
order by id;
Run Code Online (Sandbox Code Playgroud)
或者,您可以删除cumulative_sum列并在每个查询上计算它:
set @csum := 0;
select id, count, (@csum := @csum + count) as cumulative_sum
from YourTable
order by id;
Run Code Online (Sandbox Code Playgroud)
这以运行的方式计算运行总和:)
Luk*_*zda 10
MySQL 8.0/MariaDB支持窗口化SUM(col) OVER():
SELECT *, SUM(cnt) OVER(ORDER BY id) AS cumulative_sum
FROM tab;
Run Code Online (Sandbox Code Playgroud)
输出:
???????????????????????????????
? id ? cnt ? cumulative_sum ?
???????????????????????????????
? 1 ? 100 ? 100 ?
? 2 ? 50 ? 150 ?
? 3 ? 10 ? 160 ?
???????????????????????????????
Run Code Online (Sandbox Code Playgroud)