表: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