sql >> Database >  >> RDS >> Sqlserver

Groepeer opeenvolgende rijen met dezelfde waarde met tijdspannes

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

SQLFiddle-demo



  1. Rails ActiveRecord - is er een manier om bewerkingen uit te voeren op tabellen zonder een id?

  2. Nieuwe velden afleiden die tellingen doorvoeren voor elk record

  3. De verbindingspool voor database '/data/data/msv_database.db' heeft geen verbinding kunnen maken. Verbindingen:0 actief, 1 inactief, 0 beschikbaar

  4. Lijst met beschikbare datumnotaties met CONVERT() in SQL Server