连续出现的数字
编写一个 SQL 查询,查找所有至少连续出现三次的数字。
+----+-----+
| Id | Num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
| Id | Num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1 |
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1 |
+-----------------+
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/consecutive-numbers
链接:https://leetcode-cn.com/problems/consecutive-numbers
sql语句如下:
select distinct Num ConsecutiveNums from (select a.Num Num, count(b.Num) 总数 from Logs a join Logs b on b.Id - a.Id <=2 and a.Num = b.Num and b.Id - a.Id >= 0 group by a.Id )t where t.总数 >= 3
1)首先进行了双表连接,双表连接的条件是:id值的相差范围是0到2,而且Num相同;
2)然后从join表中选择出Num和Num出现的次数;
3)最后外层查询再从中选择出次数大于等于3的Num;
内查询用的是group by a.id,这里不好理解:
双表连接之后,会出现大量重复的元组,比如(分别表示a表的id,b表的id,Num):
(1,1,1)(1,2,1)(1,3,1)
(2,1,1)(2,2,1)(2,3,1)
(3,1,1)(3,2,1)(3,3,1)
所以,这里group by(a.id)是非常合理的。

浙公网安备 33010602011771号