MySQL - запрос для поиска непрерывного диапазона неиспользуемых значений - PullRequest
2 голосов
/ 25 июля 2010

У меня есть таблица, содержащая целочисленные значения от 0 до некоторого большого числа N, но с некоторыми пробелами.Я пытаюсь написать эффективный запрос, который найдет первый набор непрерывных значений некоторой длины, которые находятся в пределах 0 и N, но не содержатся в указанной таблице.Здесь есть приложения для поиска неиспользуемых идентификаторов и т. Д.

Например, с учетом набора

[1,2,3,4,10,11,12,13,1415]

, найдите диапазон непрерывных 5 чисел, которых нет в наборе.Это должно быть

[5,6,7,8,9]

.Как мне написать это в одном эффективном запросе?спасибо.

1 Ответ

3 голосов
/ 25 июля 2010

Вот отличная глава из SQL Server MVP Deep Dives книги на эту тему.

http://www.manning.com/nielsen/SampleChapter5.pdf

Вот одно из решений

WITH StartingPoints AS
(
SELECT seqval, ROW_NUMBER() OVER(ORDER BY seqval) AS rownum
FROM dbo.NumSeq AS A
WHERE NOT EXISTS
(SELECT *
FROM dbo.NumSeq AS B
WHERE B.seqval = A.seqval - 1)
),
EndingPoints AS
(
SELECT seqval, ROW_NUMBER() OVER(ORDER BY seqval) AS rownum
FROM dbo.NumSeq AS A
WHERE NOT EXISTS
(SELECT *
FROM dbo.NumSeq AS B
WHERE B.seqval = A.seqval + 1)
)
SELECT S.seqval AS start_range, E.seqval AS end_range
FROM StartingPoints AS S
JOIN EndingPoints AS E
ON E.rownum = S.rownum;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...