题目
链接:https://leetcode-cn.com/problems/consecutive-numbers)
编写一个 SQL 查询,查找所有至少连续出现三次的数字。
返回的结果表中的数据可以按 任意顺序 排列。
查询结果格式如下面的例子所示:
Logs 表:
+----+-----+
| Id | Num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
Result 表:
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1 |
+-----------------+
1 是唯一连续出现至少三次的数字。
解法
1.研究 “连续出现”的数字都有什么特征
2.用什么函数可以将连续出现的数字筛选出来
发现:按Num分组排序,行号-组内行号为0的组合出现3次及以上,可以判断为出现至少三次。
举例说明如下:
Id | Num | GroupId | cha |
---|---|---|---|
1 | 1 | 1 | 0 |
2 | 1 | 2 | 0 |
3 | 1 | 3 | 0 |
5 | 1 | 4 | 1 |
4 | 2 | 1 | 3 |
6 | 2 | 2 | 4 |
7 | 2 | 3 | 4 |
上表GroupId为使用窗口函数进行得组内排序,cha=行号-组内行号。根据上表可以看出Num=1连续出现了3次,Num=2连续出现了2次。
所以,本题先求出上表,再根据Num和chachu出现的次数进行筛选。
SELECT distinct Num "ConsecutiveNums"
FROM (
SELECT Num,
(row_number() OVER (ORDER BY id )
-
row_number() OVER (PARTITION BY Num ORDER BY id)) AS cha
FROM Logs
) tab
GROUP BY Num, cha
HAVING COUNT(cha) >= 3