扫码关注官方订阅号
我有一个看起来像这样的表:
id count 1 100 2 50 3 10
我想要添加一个名为cumulative_sum的新列,所以表看起来像这样:
id count cumulative_sum 1 100 100 2 50 150 3 10 160
有没有一条MySQL更新语句可以轻松实现这个?最好的方法是什么?
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
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
注意:
JOIN (SELECT @running_total := 0) r
SET
r
注意事项:
ORDER BY
如果性能是一个问题,你可以使用MySQL变量:
set @csum := 0; update YourTable set cumulative_sum = (@csum := @csum + count) order by id;
或者,你可以移除cumulative_sum列,并在每个查询中计算它:
cumulative_sum
set @csum := 0; select id, count, (@csum := @csum + count) as cumulative_sum from YourTable order by id;
这样以一种连续的方式计算累积和 :)
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
使用相关查询:
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使用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注意:
JOIN (SELECT @running_total := 0) r是一个交叉连接,允许在不需要单独的SET命令的情况下声明变量。r注意事项:
ORDER BY非常重要,它确保顺序与原始问题匹配,并且对于更复杂的变量使用(例如:伪ROW_NUMBER/RANK功能,MySQL不支持)可能会有更大的影响如果性能是一个问题,你可以使用MySQL变量:
或者,你可以移除
cumulative_sum列,并在每个查询中计算它:这样以一种连续的方式计算累积和 :)