Jika Anda menggunakan SQLServer 2012 atau lebih baik, Anda dapat menggunakan LAG
untuk mendapatkan nilai kolom sebelumnya, maka SUM() OVER (ORDER BY ...)
untuk membuat rolling sum, dalam hal ini yang menghitung perubahan CourseName, yang dapat digunakan sebagai GROUP BY
jangkar
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