2010-07-25 6 views
2

J'ai une table contenant des valeurs entières de 0 à un grand nombre N, mais il y a quelques espaces entre les nombres. J'essaie d'écrire une requête efficace qui trouvera le premier ensemble de valeurs continues d'une certaine longueur qui sont dans 0 et N, mais ne sont pas contenues dans ledit tableau. Cela a des applications pour trouver ids inutilisées, etc.MySQL - Requête pour trouver une plage continue de valeurs inutilisées

Par exemple, compte tenu de l'ensemble

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

, trouve une plage de 5 nombres continus qui ne sont pas dans l'ensemble. Il devrait être

[5,6,7,8,9]

. Comment écrire ceci dans une seule requête efficace? Merci.

+0

Peut-être que je me trompe, mais je pense que votre seule option est de passer par chaque ligne unique jusqu'à ce que vous le trouverez ... – quantumSoup

+0

Cela ne devrait pas être étiqueté avec "algorihm" tag –

Répondre

3

Voici un grand chapitre de SQL Server MVP Deep Dives livre sur ce sujet.

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

est ici l'une des solutions

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

merci, eu ce que je cherchais! – sa125

+0

De rien! – hgulyan

+1

Ça m'étonne toujours ce que vous pouvez faire avec juste une instruction SQL – Klik

Questions connexes