【刷题记录】5.连续出现的数字

247 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

题目来源:LeetCode>连续出现的数字

表:

Logs

Column NameType
idint
numvarchar

id 是这个表的主键。

编写一个 SQL 查询,查找所有至少连续出现三次的数字。

返回的结果表中的数据可以按 任意顺序 排列。

查询结果格式如下面的例子所示:

示例 1:

输入:

Logs 表:

IdNum
11
21
31
42
51
62
72

输出:

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