2010-07-25 3 views
2

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

Например, учитывая множество

[1,2,3,4,10,11,12,13,14,15]

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

[5,6,7,8,9]

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

+0

Может быть, я ошибаюсь, но я думаю, что единственный вариант, чтобы пройти через каждую строку, пока вы не найдете ... – quantumSoup

+0

Это не должно быть с меткой «algorihm» –

ответ

3

Вот отличная глава от 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; 
+0

спасибо, получил то, что я искал! – sa125

+0

Добро пожаловать! – hgulyan

+1

Меня всегда поражает то, что вы можете сделать только с помощью инструкции SQL – Klik

Смежные вопросы