文章目录
1、查找连续n条记录以上
问题好像是来源于力扣601题,因此做个记录。我随便造了一个数据,如下表test
| con | id |
|---|---|
| 赵 | 3 |
| 钱 | 10 |
| 孙 | 11 |
| 李 | 12 |
| 周 | 13 |
| 汉 | 4 |
| 宋 | 21 |
| 元 | 22 |
| 明 | 23 |
我们要找出id连续的记录,比如【3,4】;【21,22,23】等。思路如下,分为两步
1、
理一下思路,如果一个序列连续且唯一,那么他减去一个唯一连续的序列,对于连续序列来说差值一定是相同的。 [11,12,15] - [1,2,3] = 【10,10,12】
--那么如何制造一个连续序列呢?由于id唯一,你可以随便用一个排序窗口函数
select *,
id - rank() over(order by id) diff
from test
2、
根据步骤1种的查询结果diff, 连续值的差值一定相同。我们可以根据diff做一个统计函数,使用开窗函数count() over()
select id,
count(*) over(partition by diff) num
from (
select *,
id - rank() over(order by id) diff
from test ) a
最后你只需用一个条件过滤,挑选你需要连续几条以上的记录。
完整代码如下
with p as (
select id,
count(*) over(partition by diff) num
from (
select *,
id - rank() over(order by id) diff
from test ) a
)
select * from test
where id in (select id from p where num >=4)
这里以查询连续4条或以上为例子,将结果如下:

本文介绍了一种使用SQL查询连续ID记录的方法。通过排名函数和窗口函数的组合,可以有效地找出表中连续的ID序列,适用于查找如连续编号的员工记录等场景。
2801

被折叠的 条评论
为什么被折叠?



