Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Grupuj kolejne wiersze o tej samej wartości, korzystając z przedziałów czasowych

Jeśli używasz SQLServer 2012 lub nowszego, możesz użyć LAG aby uzyskać poprzednią wartość kolumny, a następnie SUM() OVER (ORDER BY ...) aby utworzyć sumę kroczącą, w tym przypadku taką, która zlicza zmianę CourseName, która może być użyta jako GROUP BY kotwica

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. Jak zaktualizować dużą tabelę z milionami wierszy w SQL Server?

  2. Zapytanie do konwersji Varchar HH:MM na Integer Minutes w SQL Server 2008

  3. Msg 102, Poziom 15, Stan 1, Wiersz 1 Nieprawidłowa składnia w pobliżu „ ”

  4. Funkcja krzyża tabulacji SQL

  5. Jak mogę rozwiązać problem z pulą połączeń między ASP.NET i SQL Server?