连续出现的数字

246 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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

三、执行结果

image.png

四、总结

  • distinct: distinct只能在select语句中使用,表示对后面的所有参数的拼接取不重复的记录,即查出的参数凭借每行记录都是唯一的。也会与count(distinct)在一起使用,起的统计字段去重且不为nulL的记录。
  • and: 将多个条件结合起来