持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
一、题目
表: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 是唯一连续出现至少三次的数字。
- 来源:力扣(LeetCode)
- 链接:leetcode.cn/problems/co…
- 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题
创建数据表
根据题意设置表字段并填充数据
create table if not exists Logs (
id int,
num int
);
truncate table Logs;
insert into Logs values
('1', '1'),
('2', '1'),
('3', '1'),
('4', '2'),
('5', '1'),
('6', '2'),
('7', '2');
解题思路
- 根据题意得知,这里要找至少连续重复三次的数字,说到重复,这里就要想到使用distinct
- 这时能拿到重复的字段有1和2,如何判断事连续三次或以上的重复,那么就直接设置虚拟表,例如a1,a2,a3,判断三个值得id相同得同时,如果它们得值也相同,那么就证明了该数字是要求得得数字。
- 这里设置
a1.Id = a2.Id - 1 AND a2.Id = a3.Id - 1这里就得到了id的连续,与此同时计算数字是否相同a1.Num = a2.Num AND a2.Num = a3.Num - 最终执行查询就得到至少重复三次以上的数字。
代码
查询语句
SELECT DISTINCT
a1.Num AS ConsecutiveNums
FROM
Logs a1,
Logs a2,
Logs a3
WHERE
a1.Id = a2.Id - 1
AND a2.Id = a3.Id - 1
AND a1.Num = a2.Num
AND a2.Num = a3.Num
三、执行结果
四、总结
- distinct: distinct只能在select语句中使用,表示对后面的所有参数的拼接取不重复的记录,即查出的参数凭借每行记录都是唯一的。也会与count(distinct)在一起使用,起的统计字段去重且不为nulL的记录。
- and: 将多个条件结合起来