Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Групирайте последователни редове с една и съща стойност, като използвате интервали от време

Ако използвате SQLServer 2012 или по-добър, можете да използвате LAG за да получите предишната стойност на колона, след това SUM() OVER (ORDER BY ...) за създаване на подвижна сума, в този случай такава, която отчита промяната на CourseName, която може да се използва като GROUP BY котва

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

Демо на 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. Форматът на датата на SQL Server зависи от потребителя?

  2. SQL замества всички NULL

  3. неуспешно влизане за потребител 'sa'. Потребителят не е свързан с доверена връзка на SQL Server. (Microsoft SQL Server, грешка:18452) в sql 2008

  4. 3 начина да получите първия ден от месеца в SQL Server

  5. Наблюдавайте SQL база данни чрез SP_WhoIsActive или FogLight | Отстраняване на проблеми с производителността на SQL Server -1