0 问题描述
html
表:Logs
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| num | varchar |
+-------------+---------+
在 SQL 中,id 是该表的主键。
id 是一个自增列。
找出所有至少连续出现三次的数字。返回的结果表中的数据可以按 任意顺序 排列。
结果格式如下面的例子所示:
示例 1:
输入:
Logs 表:
+----+-----+
| id | num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
输出:
Result 表:
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1 |
+-----------------+
解释:1 是唯一连续出现至少三次的数字。
1 数据准备
sql
CREATE TABLE Logs (
`id` int comment '',
`num` string comment ''
) COMMENT 'xxx'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
insert overwrite table Logs
values (1, '1'),
(2, '1'),
(3, '1'),
(4, '2'),
(5, '1'),
(6, '2'),
(7, '2');
2 思路分析
思路一:窗口函数
sql
select
num
from (
select num,
lag(num, 1, null) over (order by id ) num1,
lead(num, 1, null) over (order by id ) num2
from Logs
) tmp1
where num = num1
and num = num2;
笔记:lag / lead 前后函数
sql
lag(column,n,default) over(partition by xxx order by xxx) as lag_test
-- 取得column列前边的第n行数据,如果存在则返回,如果不存在,返回默认值default
lead(column,n,default) over(partition by xxx order by xxx) as lead_test
-- 取得column列后边的第n行数据,如果存在则返回,如果不存在,返回默认值default
思路二:mysql中的二元组
sql
-- MySQL中的二元组
select
distinct num as consecutivenums
from logs
where (id+1, num) in (select * from logs)
and (id+2, num) in (select * from logs)
思路二是参考大佬的写法。解析: (id+1, num) 括号代表二元元组,in子查询的返回结果,是由二元元组构成的表,借助【二元元组相等】代表对应元素分别相等的思路,得出上述代码逻辑;