热线电话:13121318867

登录
2020-06-13 阅读量: 791
MySQL面试题:计算连续出现的数字

题目要求:编写一个 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的信息,同样也可以执行出来

最后的执行结果:

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

20.1335
1
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子