sql >> Database teknologi >  >> RDS >> Sqlserver

Gruppér på hinanden følgende rækker med samme værdi ved brug af tidsrum

Hvis du bruger SQLServer 2012 eller bedre, kan du bruge LAG for at få den forrige værdi af en kolonne, derefter SUM() OVER (ORDER BY ...) at oprette en rullende sum, i dette tilfælde en, der tæller ændringen af ​​CourseName, der kan bruges som 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. Fejl ved installation af psycopg2==2.6.2

  2. Hvordan opretter jeg permalinks, der er databasedrevne?

  3. Mysql måned - år sammenligning

  4. Hvad er erstatningen for uniqueidentifier i Mysql