文章目录
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条或以上为例子,将结果如下: