Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Kelompokkan baris berdasarkan kondisi

Anda dapat menggunakan Recursive CTE . Saya tidak bisa memikirkan cara yang lebih baik.

;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. Bagaimana cara mengembalikan nilai dari SQL Stored Procedure dinamis ke Entity Framework?

  2. SQL Server - Pilih kolom yang memenuhi kondisi tertentu?

  3. Mengapa SET DEADLOCK_PRIORITY HIGH SQL Server tidak dihormati?

  4. SQL Server ganti, hapus semua setelah karakter tertentu

  5. Mengapa kueri ini tidak menggunakan indeks yang tepat?