Nếu bạn đang sử dụng SQLServer 2012 trở lên, bạn có thể sử dụng LAG
để lấy giá trị trước đó của một cột, sau đó SUM() OVER (ORDER BY ...)
để tạo tổng luân phiên, trong trường hợp này là tổng thay đổi Tên khóa học, có thể được sử dụng làm GROUP BY
neo
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