编写一个 SQL 查询,查找所有至少连续出现三次的数字。
Id | Num |
---|---|
1 | 1 |
2 | 1 |
3 | 1 |
4 | 2 |
5 | 1 |
6 | 2 |
7 | 2 |
例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。
ConsecutiveNums |
---|
1 |
思路:
我们这里需要考虑两种情况,leetcode官方认为id是连续的,但是实际上id因为各种原因不连续的情况太多了,我们这里需要准备两种解法,连续id解法, 实际成生产情况解法(也就是id不连续)。
题解1(id连续):
SELECT *
FROM
Logs l1,
Logs l2,
Logs l3
WHERE
l1.Id = l2.Id - 1
AND l2.Id = l3.Id - 1
AND l1.Num = l2.Num
AND l2.Num = l3.Num
;
题解1(id不连续):
使用select 语句初始化变量cnt pre,可看做表,
如果pre与t.num 相等,则cnt加1, 否则cnt重置为1
将生成的num与cnt次数的表,作为新的表 a
SELECT DISTINCT a.Num ConsecutiveNums FROM (
SELECT t.Num ,
@cnt:=IF(@pre=t.Num, @cnt+1, 1) cnt, // 三元表达式
@pre:=t.Num pre // 记录前一个值
FROM Logs t, (SELECT @pre:=null, @cnt:=0) b)a // 初始化变量
WHERE a.cnt >= 3