找出连续区间的起止数字
LeetCode 1285 · 连续区间、数字减行号
面试怎么回答
用 log_id - ROW_NUMBER() OVER (ORDER BY log_id) 作为分组键,连续的数字差值相同,按差值分组取 MIN、MAX 就是区间起止。这和连续日期、连续登录是同一个 gaps and islands 套路。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
日志表里原本是连续的 ID,后来删掉了一些。把剩下的 ID 合并成连续区间,输出每个区间的起始和结束 ID,按起始 ID 排序。
表结构
- Logs:log_id(主键)
思路
和「连续日期段」是同一个套路:按 ID 排序编行号,ID 减行号,同一个连续区间里这个差值相同,不同区间之间差值会跳变。按差值分组取 MIN 和 MAX,就是每个区间的起止。
参考解法
SELECT
MIN(log_id) start_id,
MAX(log_id) end_id
FROM
(SELECT
log_id,
log_id - row_number() OVER(ORDER BY log_id) as diff
FROM Logs) t
GROUP BY diff
易错点
- 结果要按起始 ID 排序,记得加 ORDER BY。