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