题目要求:编写一个 SQL 查询,查找所有至少连续出现三次的数字。
+----+-----+
| Id | Num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
例如,给定上面的Logs
表,1
是唯一连续出现至少三次的数字。
最后返回的结果:
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1 |
+-----------------+
解题思路:
连续出现的数字意味着相同数字的 Id 是连着的,由于这题问的是至少连续出现 3 次,我们使用Logs做3次自连接检查是否有 3 个连续的相同数字。
官方答案:
执行语句:
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

然后我们从上表中选择任意的 Num 获得想要的答案。同时我们需要添加关键字 DISTINCT ,因为如果一个数字连续出现超过 3 次,会返回重复元素。
最后的答案:
SELECT DISTINCT
l1.Num AS ConsecutiveNums
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
来源:力扣网
但是我觉得这个存在问题,假如这个id号码不是连续的呢?加入不是3次而是10次,要做10次自连接吗?而且这个题目是至少出现3次,不是仅出现3次,所有我觉得这个写法不严谨
这是我自己用窗口函数写的解决方法,欢迎大家提出自己的意见和看法
select num,count(id) 次数 from
(select *,row_number()over(order by num) 序号 from logs) t
group by num,序号-id
having 次数>=3;
执行结果:

同时我重新插入5条数值是4的信息,同样也可以执行出来

最后的执行结果:

如果有更简单更快捷的写法,欢迎大家在下面留言~~~








暂无数据