Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie finde ich die Grenzen von Gruppen zusammenhängender fortlaufender Nummern?

Wie in den Kommentaren erwähnt, handelt es sich um ein klassisches Problem mit Lücken und Inseln.

Eine von Itzik Ben Gan populäre Lösung besteht darin, die Tatsache zu verwenden, dass ROW_NUMBER() OVER (ORDER BY number) - number bleibt innerhalb einer "Insel" konstant und kann nicht auf mehreren Inseln erscheinen.

WITH T
     AS (SELECT ROW_NUMBER() OVER (ORDER BY number) - number AS Grp,
                number
         FROM   mytable
         WHERE  status = 0)
SELECT MIN(number) AS [From],
       MAX(number) AS [To]
FROM   T
GROUP  BY Grp
ORDER  BY MIN(number) 

NB:Wenn number ist nicht garantiert eindeutig, ersetzen Sie ROW_NUMBER mit DENSE_RANK im Code oben.