连续出现的数字

编写一个 SQL 查询,查找所有至少连续出现三次的数字。
+----+-----+
| Id | Num |
+----+-----+
| 1  |  1  |
| 2  |  1  |
| 3  |  1  |
| 4  |  2  |
| 5  |  1  |
| 6  |  2  |
| 7  |  2  |
+----+-----+

例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1               |
+-----------------+
来源:力扣(LeetCode)
链接: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)是非常合理的。

 

posted @ 2020-03-11 12:05  盛夏群岛  阅读(230)  评论(0)    收藏  举报