MySQL中基于现有表行累积求和创建新表的实现方法
嘿,这个需求本质就是计算**累积求和(Running Total)**嘛!不同数据库的实现方法略有区别,我给你整理了几种常用的方案,按需选用就行:
方法1:窗口函数(推荐,简洁高效)
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server、Oracle等),这是最简洁高效的实现方式。假设input表的结构是month_num INT(1到12的月份编号)、ind_value DECIMAL(10,2)(对应月份的IND数据),代码如下:
CREATE TABLE output AS SELECT month_num, -- 从第一行到当前行的累加求和,ORDER BY保证按月份顺序计算 SUM(ind_value) OVER (ORDER BY month_num) AS cumulative_ind FROM input ORDER BY month_num;
如果想更明确地指定累加范围,可以把窗口函数写得更完整:
SUM(ind_value) OVER (ORDER BY month_num ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_ind
方法2:自连接(兼容老版本数据库)
要是你用的是不支持窗口函数的老版本数据库(比如MySQL 5.x),可以用自连接的方式实现:
CREATE TABLE output AS SELECT i1.month_num, SUM(i2.ind_value) AS cumulative_ind FROM input i1 -- 关联当前月份及之前的所有行 JOIN input i2 ON i2.month_num <= i1.month_num GROUP BY i1.month_num ORDER BY i1.month_num;
方法3:MySQL专属变量累加
MySQL还支持用用户变量手动实现累加,适合熟悉变量操作的场景:
CREATE TABLE output AS SELECT month_num, -- 每次将当前值累加到变量中,得到累积结果 @running_total := @running_total + ind_value AS cumulative_ind FROM input, -- 初始化累加变量为0 (SELECT @running_total := 0) AS init ORDER BY month_num;
注意事项
- 确保
input表中的month_num是连续的1到12,没有缺失;如果有缺失月份,需要先补全再计算累积值。 - 如果需要保留原表的其他字段,直接在SELECT语句中添加对应字段即可。
内容的提问来源于stack exchange,提问作者azim
相关产品推荐
相关产品推荐

