leetcode--SQL--180 连续出现n次的数字

表:Logs

±------------±--------+
| Column Name | Type |
±------------±--------+
| id | int |
| num | varchar |
±------------±--------+
id 是这个表的主键。
编写一个 SQL 查询,查找所有至少连续出现三次的数字。
返回的结果表中的数据可以按 任意顺序 排列。
查询结果格式如下面的例子所示:
Logs 表:
±—±----+
| Id | Num |
±—±----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
±—±----+

Result 表:
±----------------+
| ConsecutiveNums |
±----------------+
| 1 |
±----------------+
1 是唯一连续出现至少三次的数字

链接:leetcode地址
解题
1,思路:首先看题意可知,我们是需要求连续出现n次的数字,有两列,id,num。因为id列是自增列,所以可以利用这个天然的解题口,根据num进行分区排序,如果数字连续出现n次,那么排序结果的次序和id的次序应该是有一个恒定差的

|id|num|sort
|1 | v1| 1
|2 | 34| 1

|n | v1| s1
|n+1| v1| s1+1
|n+2| v1| s1+2

如上所示,num为v1连续出现了多次,在第n行之前连续出现了s1-1次,那n行开始之后出现的排序是s1,s1+1,s1+2
那么在连续出现多次的记录中,sort-id是一个恒定值s1-n,所以我们通过这个切入点来判断连续出现的数字
2,sql:

select distinct Num as ConsecutiveNums 
from(
    select Num,
        if(Id>rn,Id-rn,rn-Id) as cha
    from
    (
        select Id,
            Num,
            row_number() over(partition by Num order by Id) as rn
        from Logs
    )t
)t2
group by Num,cha
having count(1)>=3

因为是要求连续出现3次的数字,所以这里限制count(1)>3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值