MySQL查连续记录、天数(2次或3次都可)的思路

1、查找连续n条记录以上

问题好像是来源于力扣601题,因此做个记录。我随便造了一个数据,如下表test

conid
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条或以上为例子,将结果如下:
在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值