SQL 查询连续(递增)ID
Aidan Engineer

查询一个表中连续出现的 ID 或者是查询连续递增的 ID 其实是很常见的场景,这里记录一下我使用的方法

查询连续重复的 ID

LeetCode 地址

直接进行连接通过连续的 ID 值保证元组的平行,然后约束相等条件即可

1
2
3
4
5
6
select distinct l1.Num as ConsecutiveNums
from Logs l1
left join Logs l2 on l1.id = l2.id + 1
left join Logs l3 on l1.id = l3.id + 2
where l1.num = l2.num
and l1.num = l3.num;

查询连续递增的 ID

LeetCode 地址

先看结果要求:

找出每行的人数大于或等于 100 且 id 连续的三行或更多行记录

人数大于 100 好说,重点是连续三行以上的 id 连续

这是我的测试数据:

id visit_date people
1 2021-09-01 999
2 2021-09-02 1000
3 2021-09-03 1001
4 2021-09-04 100
5 2021-09-05 1003
6 2021-09-06 1004
7 2021-09-07 1005
8 2021-09-08 1006

要找三行以上就将三个表进行一个左连接,当 S1.id + 1 = S2.id && S1.id + 2 = S3.id 就表示连续三个以上了,但这时三个连续以上的数据并不是在一个表中,比如上表中符合条件的最后四行,只有 S1 中只有 5, 6 时 S2 才可以有 6, 7,S3 才可以有 7, 8,但这时的结果是这样的

S1.id S2.id S3.id
5 6 7
6 7 8

所以将查询出来看作一个子表,使用内连接的方式对数据进行筛选, S.id = SS.i or S.id = SS.ii or S.id = SS.iii 其中 SS 作为结果子表,i, ii, iii 分别是每个连接表的 id,这时在表 S 中符合条件的 id 就是 5, 6, 6, 7, 7, 8 ,使用 distinct 修饰一下即可,完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
select distinct S.*     # 进行结果去重 
from Stadium as S
inner join # 将主表与连续 id 的结果进行内连接
(
select S1.id as i, S2.id as ii, S3.id as iii
from Stadium as S1
left join Stadium as S2 on S1.id + 1 = S2.id
left join Stadium as S3 on S1.id + 2 = S3.id
where S1.people >= 1000 # 这里使用的测试数据为大于 1000
and S2.people >= 1000
and S3.people >= 1000
) SS
where (S.id = SS.i or S.id = SS.ii or S.id = SS.iii)
order by S.id
  • 本文标题:SQL 查询连续(递增)ID
  • 本文作者:Aidan
  • 创建时间:2021-11-10 18:25:14
  • 本文链接:https://aidanblog.top/sql-continuous_id/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论