Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Kelompokkan baris berurutan dengan nilai yang sama menggunakan rentang waktu

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

Demo SQLFiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Praktik Terbaik Pemulihan Bencana Microsoft SQL Server

  2. Ekspresi Tabel Umum, mengapa titik koma?

  3. SQL Server 2008 PILIH * DARI @variabel?

  4. Memuat file dll di dalam proyek Java Eclipse

  5. Mengedit masalah Rekam di Access / SQL (Konflik Tulis)