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

Grupuj wiersze według warunku

Możesz użyć Recursive CTE . Nie mogę wymyślić lepszego sposobu.

;WITH cte
     AS (SELECT *,
                Row_number()OVER(ORDER BY start) rn
         FROM   Yourtable),
     rec_cte
     AS (SELECT *,
                ( [End] - Start ) AS st,
                1                 AS grp
         FROM   cte
         WHERE  rn = 1
         UNION ALL
         SELECT a.*,
                CASE
                  WHEN st + ( a.[End] - a.Start ) >= 500 THEN a.[End] - a.Start
                  ELSE st + ( a.[End] - a.Start )
                END,
                CASE
                  WHEN st + ( a.[End] - a.Start ) >= 500 THEN b.grp + 1
                  ELSE grp
                END
         FROM   cte a
                JOIN rec_cte b
                  ON a.rn = b.rn + 1)
SELECT Min(Start) as Start,
       Max([End]) as [End],
       Max(st) as Quantity
FROM   rec_cte
GROUP  BY grp
OPTION (maxrecursion 0) 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Serwer MS SQL - zamień ciąg HEX na liczbę całkowitą

  2. SQL Server 2005 Unikalne ograniczenie dwóch kolumn

  3. Czy sortowanie sqlserver oznacza, że ​​nazwy kolumn muszą mieć poprawną wielkość liter? I jak sobie z tym poradzić

  4. najnowsza (maksymalna) data dla każdego identyfikatora

  5. Średnia i wielkość liter w SQL