You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:54:56