Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come trovare i confini di gruppi di numeri sequenziali contigui?

Come accennato nei commenti questo è un classico problema di lacune e isole.

Una soluzione resa popolare da Itzik Ben Gan consiste nell'usare il fatto che ROW_NUMBER() OVER (ORDER BY number) - number rimane costante all'interno di un'"isola" e non può apparire in più isole.

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:Se number non è garantito che sia univoco sostituire ROW_NUMBER con DENSE_RANK nel codice sopra.