在 MySQL 中,如果你想计算 相邻两行数据的差值(例如当前行的值减去前一行的值),可以使用 窗口函数(Window Functions)(MySQL 8.0+ 支持)或 自连接(Self Join)(适用于所有 MySQL 版本)。以下是几种实现方法:
MySQL 8.0 引入了窗口函数(如 LAG()),可以轻松访问前一行的值。
value 列差值假设有一个表 data_table:
CREATE TABLE data_table (
id INT AUTO_INCREMENT PRIMARY KEY,
value INT
);
INSERT INTO data_table (value) VALUES (10), (15), (20), (25), (30);数据:
id | value
---+------
1 | 10
2 | 15
3 | 20
4 | 25
5 | 30value 减去前一行 value 的差值SELECT
id,
value,
value - LAG(value) OVER (ORDER BY id) AS diff
FROM
data_table;结果:
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 值。diff 为 NULL,因为没有前一行。如果 MySQL 版本 < 8.0,可以使用自连接模拟 LAG() 的功能。
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;结果:
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:确保 t2 是 t1 的前一行。diff 为 NULL,因为 t2.id = 0 不存在。