MySQL计算相邻行approved字段差值并生成别名approved_diff
MySQL 实现相邻行差值计算方案
MySQL 8.0 及以上版本(推荐)
MySQL 8.0 原生支持窗口函数,用LAG()函数可以直接实现需求,逻辑简洁且性能更好:
SELECT date, approved, approved - LAG(approved, 1, 0) OVER (ORDER BY date ASC) AS approved_diff FROM transaction ORDER BY date ASC;
逻辑说明
LAG(approved, 1, 0)作用是取按date升序排序后,当前行往前1行的approved字段值,如果是排序后的第一行(不存在上一行),默认返回0- 第一行计算结果为
approved - 0,等于当前行approved值,符合首行计算规则;后续行自动计算当前行与上一行的差值 - 外层
ORDER BY date ASC保证最终返回结果排序和计算逻辑一致
MySQL 5.x 版本(无窗口函数兼容方案)
如果使用不支持窗口函数的旧版本MySQL,可以通过用户变量记录上一行值实现相同效果:
SELECT date, approved, approved - @prev AS approved_diff, @prev := approved FROM ( -- 子查询先固定排序,避免计算顺序错乱 SELECT date, approved FROM transaction ORDER BY date ASC ) AS sorted_data, -- 初始化记录上一行值的用户变量,初始值设为0适配首行计算规则 (SELECT @prev := 0) AS init_var ORDER BY date ASC;
结果验证
按照给出的原始数据(按date升序approved依次为10、15、50、51、56),最终返回的approved_diff列值依次为10、5、35、1、5,完全匹配需求规则。
内容的提问来源于stack exchange,提问作者Serpa
相关产品推荐
相关产品推荐

