我有一個包含從0到大數N的整數值的表,但有一些數字差距。我試圖寫出一個高效的查詢,它將找到第一組連續的的值,其值在0和N之間,但不是,包含在上述表中。這具有的應用程序查找未使用的ID等MySQL - 查詢找到連續範圍的未使用的值
例如,給定一組
[1,2,3,4,10,11,12,13,14,15]
,找到一組連續的5個不在集合中的數字。它應該是
[5,6,7,8,9]
。我如何在單一的高效查詢中編寫這些內容?謝謝。
我有一個包含從0到大數N的整數值的表,但有一些數字差距。我試圖寫出一個高效的查詢,它將找到第一組連續的的值,其值在0和N之間,但不是,包含在上述表中。這具有的應用程序查找未使用的ID等MySQL - 查詢找到連續範圍的未使用的值
例如,給定一組
[1,2,3,4,10,11,12,13,14,15]
,找到一組連續的5個不在集合中的數字。它應該是
[5,6,7,8,9]
。我如何在單一的高效查詢中編寫這些內容?謝謝。
這裏有一個偉大的章節從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;
也許我是錯的,但我認爲你唯一的選擇是要經過每一行,直到你找到它... – quantumSoup 2010-07-25 08:47:06
這不應該是標有「algorihm」標籤 – 2010-07-25 13:33:45