Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Gruppieren Sie aufeinanderfolgende Zeilen mit demselben Wert mithilfe von Zeitspannen

Wenn Sie SQLServer 2012 oder höher verwenden, können Sie LAG verwenden um den vorherigen Wert einer Spalte zu erhalten, dann SUM() OVER (ORDER BY ...) um eine fortlaufende Summe zu erstellen, in diesem Fall eine, die die Änderung des Kursnamens zählt, die als GROUP BY verwendet werden kann Anker

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

SQLFiddle-Demo