2010-07-25 89 views
2

我有一個包含從0到大數N的整數值的表,但有一些數字差距。我試圖寫出一個高效的查詢,它將找到第一組連續的的值,其值在0和N之間,但不是,包含在上述表中。這具有的應用程序查找未使用的ID等MySQL - 查詢找到連續範圍的未使用的值

例如,給定一組

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

,找到一組連續的5個不在集合中的數字。它應該是

[5,6,7,8,9]

。我如何在單一的高效查詢中編寫這些內容?謝謝。

+0

也許我是錯的,但我認爲你唯一的選擇是要經過每一行,直到你找到它... – quantumSoup 2010-07-25 08:47:06

+0

這不應該是標有「algorihm」標籤 – 2010-07-25 13:33:45

回答

3

這裏有一個偉大的章節從SQL Server MVP深潛書關於這個問題。

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 2010-07-25 11:27:43

+0

不客氣! – hgulyan 2010-07-25 11:55:14

+1

它總是令我驚訝,你可以用SQL語句做什麼 – Klik 2015-01-22 19:58:26