sql >> Database >  >> RDS >> Sqlserver

Hoe de grenzen van groepen aaneengesloten opeenvolgende getallen te vinden?

Zoals vermeld in de opmerkingen is dit een klassiek hiaten- en eilandenprobleem.

Een door Itzik Ben Gan gepopulariseerde oplossing is om gebruik te maken van het feit dat ROW_NUMBER() OVER (ORDER BY number) - number blijft constant binnen een "eiland" en kan niet op meerdere eilanden voorkomen.

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:Indien number is niet gegarandeerd uniek vervang ROW_NUMBER met DENSE_RANK in de bovenstaande code.




  1. Haal de eeuw uit een datum in PostgreSQL

  2. SAP Lumira verbinden met Microsoft Access

  3. PostgreSQL schalen met behulp van verbindingspoolers en load balancers

  4. Oracle ODP.Net en EF CodeFirst - SaveChanges-fout