Als u SQLServer 2012 of beter gebruikt, kunt u LAG
. gebruiken om de vorige waarde van een kolom te krijgen, dan SUM() OVER (ORDER BY ...)
om een voortschrijdende som te maken, in dit geval een die de wijziging van de cursusnaam telt, die kan worden gebruikt als de GROUP BY
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