表:Logs
+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | num | varchar | +-------------+---------+ 在 SQL 中,id 是该表的主键。 id 是一个自增列。
找出所有至少连续出现三次的数字。
返回的结果表中的数据可以按 任意顺序 排列。
结果格式如下面的例子所示:
示例 1:
输入: Logs 表: +----+-----+ | id | num | +----+-----+ | 1 | 1 | | 2 | 1 | | 3 | 1 | | 4 | 2 | | 5 | 1 | | 6 | 2 | | 7 | 2 | +----+-----+ 输出: Result 表: +-----------------+ | ConsecutiveNums | +-----------------+ | 1 | +-----------------+ 解释:1 是唯一连续出现至少三次的数字。
解法一:三表拼接
#三表拼接
select distinct a.num ConsecutiveNums from logs a
left join
(select * from logs) b
on a.id+1=b.id
left join
(select * from logs) c
on a.id+2=c.id
where a.num=b.num and a.num=c.num;
解法二:使用窗口函数
窗口函数格式: window_function()over([partition by 字段一] [order by 字段二])
这里使用lead窗口函数。
lead窗口函数用于获取指定字段的指定行记录下N行的数据,相当于把当前行记录向上移动了N行
格式:lead(字段名[,N[,默认值]])over([partition by 字段] [order by 字段])
与其格式一样但是功能相反的是lag窗口函数。
#窗口函数
select distinct num ConsecutiveNums from
(select
id,
lead(id,1)over(partition by num order by id) nextid,
lead(id,2)over(partition by num order by id) next2id,
num
from logs) a
where nextid=id+1 and next2id=nextid+1;