Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Agrupar linhas consecutivas de mesmo valor usando intervalos de tempo


Se você estiver usando o SQLServer 2012 ou superior, poderá usar LAG para obter o valor anterior de uma coluna, então SUM() OVER (ORDER BY ...) para criar uma soma móvel, neste caso uma que conte a mudança do CourseName, que pode ser usada como o GROUP BY âncora
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

Demonstração do SQLFiddle