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

Raggruppa righe consecutive dello stesso valore utilizzando intervalli di tempo

Se stai utilizzando SQLServer 2012 o versioni successive, puoi utilizzare LAG per ottenere il valore precedente di una colonna, quindi SUM() OVER (ORDER BY ...) per creare un rolling sum, in questo caso che conta la modifica del CourseName, che può essere utilizzato come GROUP BY ancora

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

Demo di SQLFiddle