MySQL如何查找连续行Value差值不等于1的记录
问题描述
现有数据表:
| ID | Value |
|---|---|
| 1 | 3 |
| 2 | 4 |
| 3 | 6 |
| 4 | 7 |
| 5 | 8 |
| 6 | 11 |
| 7 | 12 |
需要找出连续两行Value字段差值不等于1的记录,返回前一行的ID以及差值。期望结果如下:
| Id | Difference |
|---|---|
| 2 | 2 |
| 5 | 3 |
当前使用cPanel中的MySQL,需解决该问题。
解决方案
方法1:使用窗口函数(MySQL 8.0+ 支持)
利用LEAD()窗口函数获取下一行的Value,计算差值后筛选:
SELECT ID AS Id, (LEAD(Value) OVER (ORDER BY ID) - Value) AS Difference FROM your_table_name HAVING Difference != 1;
LEAD(Value) OVER (ORDER BY ID):按ID排序,取当前行下一行的Value值- 计算两行
Value的差值并命名为Difference - 使用
HAVING筛选差值不等于1的记录(因为Difference是计算字段,WHERE无法直接引用)
方法2:自连接(兼容低版本MySQL)
如果你的MySQL版本不支持窗口函数,可通过自连接关联连续行:
SELECT t1.ID AS Id, (t2.Value - t1.Value) AS Difference FROM your_table_name t1 JOIN your_table_name t2 ON t2.ID = t1.ID + 1 WHERE (t2.Value - t1.Value) != 1;
- 通过
t2.ID = t1.ID + 1关联当前行和下一行 - 计算差值并筛选不符合条件的记录
- 注意:此方法要求ID是连续无缺失的,否则会遗漏部分记录
内容的提问来源于stack exchange,提问作者Pygmalion
相关产品推荐
相关产品推荐

