题目来源:
力扣:数据库180题
题目内容:
表:Logs
编写一个 SQL 查询,查找所有至少连续出现三次的数字。
返回的结果表中的数据可以按 任意顺序 排列。
查询结果格式如下面的例子所示:
示例 1:
我的思路:
题目要求解至少连续出现三次的数字,一看到题目,我就想到了窗口函数,可以获取前n行和后n行的数据,当然,这里获取前1行和后1行即可,只要这三行数据相等,就取Num,然后对Num去重即得结果,sql语句如下:
select
distinct(Num) ConsecutiveNums
from
(
select
Num,
LAG(Num,1) over() last,
LEAD(Num,1) over() next
from Logs
)t1
where Num=last and Num=next;
用到的知识点:
LAG(expr,n):返回位于当前行的前n行的expr值
LEAD(expr,n):返回位于当前行的后n行的expr值
上面两个函数在MySQL8.0以上版本适用
官方题解:
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之间的关系,取连续的三个数,同时判断连续三个数的值相不相等。