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

MySQL中指定范围MAX()语法:计算当前值减同列截止当前行最大值

MySQL实现同列累计最大值差值计算方案

首先请注意:你的原表列名1、2、3属于MySQL特殊标识符,所有引用位置都需要用反引号包裹,否则会触发语法错误。以下方案默认你原表名为original_table,行顺序按ID升序定义,如果你的行顺序是按日期+时间排序,可自行调整排序逻辑。


方案1:MySQL 8.0+ 版本(推荐,性能最优)

MySQL 8.0开始支持窗口函数,可以直接实现滑动窗口的累计最大值计算,语法简洁:

-- 直接创建新表并写入计算结果
CREATE TABLE new_calculated_table AS
SELECT 
    ID,
    Date,
    Time,
    `1` - MAX(`1`) OVER (ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `1`,
    `2` - MAX(`2`) OVER (ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `2`,
    `3` - MAX(`3`) OVER (ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `3`
FROM original_table;

逻辑说明

  • ORDER BY ID 指定按ID从小到大的顺序计算滑动窗口
  • ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 定义窗口范围为结果集第一行到当前行,完全匹配你的计算规则
  • 如果你需要按时间顺序定义行顺序,把ORDER BY ID替换为ORDER BY STR_TO_DATE(Date, '%m/%d/%Y'), Time即可

方案2:MySQL 5.x 及更低版本(兼容旧版本)

如果你的MySQL版本不支持窗口函数,可以用自关联+分组的方式实现:

CREATE TABLE new_calculated_table AS
SELECT 
    t1.ID,
    t1.Date,
    t1.Time,
    t1.`1` - MAX(t2.`1`) AS `1`,
    t1.`2` - MAX(t2.`2`) AS `2`,
    t1.`3` - MAX(t2.`3`) AS `3`
FROM original_table t1
INNER JOIN original_table t2 
    ON t2.ID <= t1.ID -- 关联所有ID小于等于当前行的记录,对应累计到当前行的范围
GROUP BY t1.ID, t1.Date, t1.Time
ORDER BY t1.ID;

逻辑说明

通过自连接将当前行和所有历史行(含当前行)关联,分组后取历史行的最大值,再和当前行的值做差,结果和窗口函数方案完全一致。


结果验证(以列1为例)

按你的样例数据计算结果如下,和需求完全匹配:

ID列1原值累计最大值新值
13.153.150
20.003.15-3.15
3-0.443.15-3.59
40.853.15-2.3
5-1.073.15-4.22
62.053.15-1.1

内容的提问来源于stack exchange,提问作者MihaiOW

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:15:07