SQL面试问题

Krn*_*rns 10 sql gaps-and-islands

我在接受采访时得到了以下问题:给出一个自然数字表和一些缺失的数据表,提供两个表的输出,第一个表中的数字间隙开始,第二个表结束.例:

 ____    ________
|    |   |   |   |
| 1  |   | 3 | 3 |
| 2  |   | 6 | 7 |
| 4  |   | 10| 12|
| 5  |   |___|___|
| 8  |
| 9  |
| 13 |
|____|

sta*_*ack 6

虽然这与Phil Sandler的答案几乎相同,但这应该返回两个单独的表(我认为它看起来更干净)(至少在SQL Server中有效):

DECLARE @temp TABLE (num int)
INSERT INTO @temp VALUES (1),(2),(4),(5),(8),(9),(13)

DECLARE @min INT, @max INT
SELECT @min = MIN(num), @max = MAX(num) FROM @temp

SELECT t.num + 1 AS range_start
    FROM @temp t
    LEFT JOIN @temp t2 ON t.num + 1 = t2.num
    WHERE t.num < @max AND t2.num IS NULL

SELECT t.num - 1 AS range_end
    FROM @temp t
    LEFT JOIN @temp t2 ON t.num - 1 = t2.num
    WHERE t.num > @min AND t2.num IS NULL