订阅更新

找出连续区间的起止数字

SQL 实战 123 题 · 第 88 题 中等 约 2 分钟读完

LeetCode 1285 · 连续区间、数字减行号

本文目录
  1. 面试怎么回答
  2. 题意
  3. 表结构
  4. 思路
  5. 参考解法
  6. 易错点

面试怎么回答

用 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。
刷题进度保存在当前浏览器