Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment trouver les limites de groupes de nombres séquentiels contigus ?

Comme mentionné dans les commentaires, il s'agit d'un problème classique de lacunes et d'îles.

Une solution popularisée par Itzik Ben Gan consiste à utiliser le fait que ROW_NUMBER() OVER (ORDER BY number) - number reste constant dans une "île" et ne peut pas apparaître dans plusieurs îles.

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 :Si number n'est pas garanti d'être unique remplacez ROW_NUMBER avec DENSE_RANK dans le code ci-dessus.