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

Regrouper des lignes consécutives de même valeur en utilisant des périodes de temps

Si vous utilisez SQLServer 2012 ou supérieur, vous pouvez utiliser LAG pour obtenir la valeur précédente d'une colonne, puis SUM() OVER (ORDER BY ...) pour créer une somme glissante, dans ce cas celle qui compte le changement de CourseName, qui peut être utilisée comme GROUP BY ancre

With A AS (
  SELECT ClassRoom
       , CourseName
       , StartTime
       , EndTime
       , PrevCourse = LAG(CourseName, 1, CourseName) OVER (ORDER BY StartTime)
  FROM   Table1
), B AS (
  SELECT ClassRoom
       , CourseName
       , StartTime
       , EndTime
       , Ranker = SUM(CASE WHEN CourseName = PrevCourse THEN 0 ELSE 1 END)
                OVER (ORDER BY StartTime, CourseName)
  FROM   A
)
SELECT ClassRoom
     , CourseName
     , MIN(StartTime) StartTime
     , MAX(EndTime) EndTime
FROM   B
GROUP BY ClassRoom, CourseName, Ranker
ORDER BY StartTime

Démo SQLFiddle