MySQL实现上下行相减

前言

执行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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值