每日leetcode

180. 连续出现的数字 - 力扣(LeetCode)

题目

表: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. 这题考察的是多表连接。
  2. 将Logs表做三次连接,连接条件是表1是开始id,表2是表1的id+1,表3是表1的id+2。
  3. 然后判断其中是否有都一样的值,如果有,就去重后输出。

代码实现

# Write your MySQL query statement below
select distinct t1.num as ConsecutiveNums
from Logs t1 
join Logs t2 on t1.id = t2.id-1
join Logs t3 on t1.id = t3.id-2
where t1.num=t2.num and t1.num=t3.num

知识积累

  • 多表连接直接一次次接就好,不需要嵌套。
  • 从其他大佬的题解里找到了一些选择相邻行的方法:
    • 选择往下n行数据:lead(属性, n, 如果没有数据时的返回值(一般为null))
    • 选择往上n行数据:lag(属性, n, 如果没有数据时的返回值(一般为null))

题解

  • 其他大佬写的特别高级,通过lag和lead方法获取上下行的数据,利用over窗口函数来扩展上下行数据作为列,再进行筛选。
  • 复现:
  • # Write your MySQL query statement below
    select distinct num as ConsecutiveNums
    from (
        select 
        num,
        lag(num, 1, null) over (order by id) as prev_num,
        lead(num, 1, null) over (order by id) as next_num
        from Logs
    ) as tmp
    where num=prev_num and num=next_num

你可能感兴趣的:(leetcode训练,leetcode,算法,职场和发展,mysql,数据库)