前言

执行sql

DROP TABLE IF EXISTS TMP;

CREATE TABLE TMP(
	I INT PRIMARY KEY AUTO_INCREMENT,
	V INT
);

INSERT INTO TMP(V) VALUES(1), (2), (3), (4);

则有如下表

mysql> select * from TMP;
+---+------+
| I | V    |
+---+------+
| 1 |    1 |
| 2 |    2 |
| 3 |    3 |
| 4 |    4 |
+---+------+
4 rows in set (0.00 sec)

实现新增一列DIFF,表示当前V与上一行V的差值,ROW2-ROW1, ROW3-ROW2…,默认第0行V为0,则有

+---+------+------+
| I | V    | DIFF |
+---+------+------+
| 1 |    1 |    1 |
| 2 |    2 |    1 |
| 3 |    3 |    1 |
| 4 |    4 |    1 |
+---+------+------+

方法一:左外连接自己

第一步,先和自己的上一行左外连接,并将上一行的V作为一个临时列V2

第二步,将V - V2

SELECT T.I I, T.V V, V - V2 DIFF
FROM (
SELECT A.I I, A.V V, IFNULL(B.V, 0) V2
FROM TMP A LEFT JOIN TMP B ON A.I = B.I + 1 ORDER BY A.I
) T;

方法二:通过变量实现

第一步,定义变量A.V初始值为0

第二步,将TMP查出来,将变量@A.V复制给V2,将当前V赋值给变量@A.V

第三步,将V-V2

SELECT T.I I, T.V V, V - V2 DIFF
FROM (
SELECT A.I AS I, A.V AS V, @A.V AS V2, @A.V:= A.V
FROM TMP A, (SELECT @A.V:=0) B
) T

若文章有误,或你有什么见解,欢迎留言指正和交流。
原创不易,若有所帮助,欢迎点赞、收藏。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐