首页
学习
活动
专区
圈层
工具
发布

mysql相邻两行数据相减

在 MySQL 中,如果你想计算 ​​相邻两行数据的差值​​(例如当前行的值减去前一行的值),可以使用 ​​窗口函数(Window Functions)​​(MySQL 8.0+ 支持)或 ​​自连接(Self Join)​​(适用于所有 MySQL 版本)。以下是几种实现方法:


​方法 1:使用窗口函数(MySQL 8.0+ 推荐)​

MySQL 8.0 引入了窗口函数(如 LAG()),可以轻松访问前一行的值。

​示例:计算相邻两行的 value 列差值​

假设有一个表 data_table

代码语言:javascript
代码运行次数:0
复制
CREATE TABLE data_table (
    id INT AUTO_INCREMENT PRIMARY KEY,
    value INT
);

INSERT INTO data_table (value) VALUES (10), (15), (20), (25), (30);

数据:

代码语言:javascript
代码运行次数:0
复制
id | value
---+------
1  | 10
2  | 15
3  | 20
4  | 25
5  | 30

​查询:计算当前行 value 减去前一行 value 的差值​

代码语言:javascript
代码运行次数:0
复制
SELECT 
    id,
    value,
    value - LAG(value) OVER (ORDER BY id) AS diff
FROM 
    data_table;

​结果​​:

代码语言:javascript
代码运行次数:0
复制
id | value | diff
---+-------+-----
1  | 10    | NULL  -- 第一行没有前一行,差值为 NULL
2  | 15    | 5     (15 - 10)
3  | 20    | 5     (20 - 15)
4  | 25    | 5     (25 - 20)
5  | 30    | 5     (30 - 25)

​说明​

  • LAG(value) OVER (ORDER BY id):获取按 id 排序的前一行的 value 值。
  • 第一行的 diffNULL,因为没有前一行。

​方法 2:使用自连接(适用于所有 MySQL 版本)​

如果 MySQL 版本 < 8.0,可以使用自连接模拟 LAG() 的功能。

​查询:计算相邻两行的差值​

代码语言:javascript
代码运行次数:0
复制
SELECT 
    t1.id,
    t1.value,
    t1.value - t2.value AS diff
FROM 
    data_table t1
LEFT JOIN 
    data_table t2 ON t1.id = t2.id + 1
ORDER BY 
    t1.id;

​结果​​:

代码语言:javascript
代码运行次数:0
复制
id | value | diff
---+-------+-----
1  | 10    | NULL  -- t2.id = 0 不存在,所以 t2.value 为 NULL
2  | 15    | 5     (15 - 10)
3  | 20    | 5     (20 - 15)
4  | 25    | 5     (25 - 20)
5  | 30    | 5     (30 - 25)

​说明​

  • t1.id = t2.id + 1:确保 t2t1 的前一行。
  • 第一行的 diffNULL,因为 t2.id = 0 不存在。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券