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原值 | 累计最大值 | 新值 |
|---|---|---|---|
| 1 | 3.15 | 3.15 | 0 |
| 2 | 0.00 | 3.15 | -3.15 |
| 3 | -0.44 | 3.15 | -3.59 |
| 4 | 0.85 | 3.15 | -2.3 |
| 5 | -1.07 | 3.15 | -4.22 |
| 6 | 2.05 | 3.15 | -1.1 |
内容的提问来源于stack exchange,提问作者MihaiOW
相关产品推荐
相关产品推荐

