在MySQL中创建累积和列

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)

使用MySQL变量:


  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都需要表别名

注意事项:

  • MySQL具体; 不可移植到其他数据库
  • ORDER BY很重要; 它确保顺序与OP匹配,并且可以对更复杂的变量使用产生更大的影响(IE:psuedo ROW_NUMBER/RANK功能,MySQL缺乏)

  • 对于“使用相关查询”,您的表 x 来自哪里? (2认同)

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)

这以运行的方式计算运行总和:)

  • 使用交叉连接来定义变量,而无需使用`SET`. (7认同)

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)

分贝<>小提琴

  • 我正在寻找使用 Windows 函数的累积总和。谢谢。 (2认同)