sql >> Databasteknik >  >> RDS >> Sqlserver

Gruppera på varandra följande rader med samma värde med tidsintervall

Om du använder SQLServer 2012 eller bättre kan du använda LAG för att få det föregående värdet av en kolumn, sedan SUM() OVER (ORDER BY ...) för att skapa en rullande summa, i det här fallet en som räknar förändringen av CourseName, som kan användas som GROUP BY ankare

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-demo



  1. REGEXP Delsträng Oracle

  2. MySql välj format, rund kolumn

  3. SQL-injektion med php-filtrering

  4. c++ mysql-anslutning bad_alloc med c++-kontakt