LeetCode--1285. 找到连续区间的开始和结束数字

文章目录

  • 1 题目描述
  • 2 测试用例
  • 3 解题思路

1 题目描述

表:Logs

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| log_id        | int     |
+---------------+---------+

id 是上表具有唯一值的列。
上表的每一行包含日志表中的一个 ID。

编写解决方案,得到 Logs 表中的连续区间的开始数字和结束数字。
返回结果表按照 start_id 排序。

2 测试用例

输入:

Logs 表:

+------------+
| log_id     |
+------------+
| 1          |
| 2          |
| 3          |
| 7          |
| 8          |
| 10         |
+------------+

输出:

+------------+--------------+
| start_id   | end_id       |
+------------+--------------+
| 1          | 3            |
| 7          | 8            |
| 10         | 10           |
+------------+--------------+

解释:
结果表应包含 Logs 表中的所有区间。
从 1 到 3 在表中。
从 4 到 6 不在表中。
从 7 到 8 在表中。
9 不在表中。
10 在表中。

3 解题思路

  1. 分析题目,连续数据的差值相等log_id - row_number() over (order by log_id asc)
select log_id, log_id - row_number() over (order by log_id asc) as rn from Logs

执行结果

+------+--+
|log_id|rn|
+------+--+
|1     |0 |
|2     |0 |
|3     |0 |
|7     |3 |
|8     |3 |
|10    |4 |
+------+--+
  1. rn字段分组统计,查询连续log_id的最开始和最后的值min(log_id) as start_id, max(log_id) as end_id,最终按照start_id排序
select min(log_id) as start_id, max(log_id) as end_id  
from (select log_id, log_id - row_number() over (order by log_id asc) as rn from Logs) as temp  
group by rn  
order by start_id asc;

执行结果

+--------+------+
|start_id|end_id|
+--------+------+
|1       |3     |
|7       |8     |
|10      |10    |
+--------+------+

你可能感兴趣的:(MySQL,LeetCode,leetcode,mysql)