Leetcode1285. 找到连续区间的开始和结束数字(中等)

表:Logs

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

id 是上表的主键。
上表的每一行包含日志表中的一个 ID。

后来一些 ID 从 Logs 表中删除。编写一个 SQL 查询得到 Logs 表中的连续区间的开始数字和结束数字。

将查询表按照 start_id 排序。

查询结果格式如下面的例子:

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 在表中。

生成数据

CREATE TABLE logs2(
log_id INT);
INSERT INTO logs2 VALUE(1), (2),(3),(7),(8),(10);

SELECT *
FROM logs2;

解答
连续的分为一组

SELECT L.`log_id`,
@group:=IF(L.`log_id`- @pre_log_id = 1, @group, @group+1) AS `group`,
@pre_log_id:= L.`log_id`
FROM logs2 AS L, (SELECT @group:=0, @pre_log_id:= NULL) AS init
ORDER BY L.log_id;

分组后最小值为起始 最大值为结束

SELECT MIN(tmp.log_id) AS start_id, MAX(tmp.log_id) AS end_id
FROM (SELECT L.`log_id`,
@group:=IF(L.`log_id`- @pre_log_id = 1, @group, @group+1) AS `group`,
@pre_log_id:= L.`log_id`
FROM logs2 AS L, (SELECT @group:=0, @pre_log_id:= NULL) AS init
ORDER BY L.log_id) AS tmp
GROUP BY tmp.group;

你可能感兴趣的:(Leetcode1285. 找到连续区间的开始和结束数字(中等))