sql >> Base de Datos >  >> RDS >> Sqlserver

Agrupar filas consecutivas del mismo valor usando intervalos de tiempo

Si está usando SQLServer 2012 o mejor, puede usar LAG para obtener el valor anterior de una columna, entonces SUM() OVER (ORDER BY ...) para crear una suma móvil, en este caso una que cuente el cambio del nombre del curso, que se puede usar como GROUP BY ancla

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

Demostración de SQLFiddle