Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
题目来源:LeetCode>连续出现的数字
表:
Logs
| Column Name | Type |
|---|---|
| id | int |
| num | varchar |
id 是这个表的主键。
编写一个 SQL 查询,查找所有至少连续出现三次的数字。
返回的结果表中的数据可以按 任意顺序 排列。
查询结果格式如下面的例子所示:
示例 1:
输入:
Logs 表:
| Id | Num |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
输出:
Result 表:
| ConsecutiveNums |
|---|
| 1 |
解释:1 是唯一连续出现至少三次的数字。
二、思路分析:
题解:连续出现意味着数据都是连续的,至少出现3次数据,那我们可以使用3张相同的表,来比对3张表连续索引的数据是否是一样的。
有:Logs1、Logs2、Logs3
Logs1的第一条数据与Logs2的第二条数据与Logs3的第三条数据做对比
Logs1的第二条数据与Logs2的第三条数据与Logs3的第四条数据做对比
......
三、AC 代码:
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
注:相同num我们只需要一条,故需要使用关键字DISTINCT,不然会返回重复元素
四、总结:
经过前面几道题以及这道题,我们需要善用多表关联查询,特别是主体只有一张表时,可以灵活的运用多张同样的表进行关联查询,来获取我们想要的结果。
当然,除了运用多表关联,也可以灵活运用mysql的函数。此题可以使用前后函数:LAG(expr,n)、LEAD(expr,n),只需要获取前一行和后一行都相等的所有数据去重即可。思路来源于:li-yong-jie-r
代码:
SELECT DISTINCT
num AS ConsecutiveNums
FROM
(
SELECT
num,
lag( num, 1, NULL ) over ( ORDER BY id ) lag_num,
lead( num, 1, NULL ) over ( ORDER BY id ) lead_num
FROM
LOGS
) l
WHERE
l.Num = l.lag_num
AND l.Num = l.lead_num