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

Buat grup berukuran merata berdasarkan agregat

SELECT  *
FROM(
    SELECT  y.TotalSizeGB,
            CASE 
                WHEN y.AnotherGrp%2=0 AND y.PseudoGrpNumber=0 THEN 2
                WHEN y.AnotherGrp%2=0 AND y.PseudoGrpNumber=1 THEN 1
                WHEN y.AnotherGrp%2=0 AND y.PseudoGrpNumber=2 THEN 0
                ELSE y.PseudoGrpNumber
            END GrpNumber
    FROM(
        SELECT 
            x.ServerName,
            x.TotalSizeGB,
            (2+ROW_NUMBER() OVER(ORDER BY x.TotalSizeGB DESC))%3 PseudoGrpNumber,
            (2+ROW_NUMBER() OVER(ORDER BY x.TotalSizeGB DESC))/3 AnotherGrp,
            ROW_NUMBER() OVER(ORDER BY x.TotalSizeGB DESC) RowNum
        FROM    @Servers x
    )y
)z
PIVOT( SUM(z.TotalSizeGB) FOR z.GrpNumber IN([0],[1],[2]) ) pvt;

Hasil:

0       1       2
------- ------- -------
2048.02 1925.80 2037.14

Beberapa penjelasan:

Idenya adalah untuk mengurutkan data secara turun pada TotalSizeGB kolom. Kemudian setiap 3 baris berurutan dikelompokkan bersama (kolom AnotherGrp ) pertama di DESC pesan dan kemudian di ASC pesanan (kolom PseudoGroNumber dan GrpNumber ). Jika dijalankan SELECT * FROM () y turunan tabel maka hasilnya akan menjadi:

ServerName TotalSizeGB  PseudoGrpNumber AnotherGrp GrpNumber RowNum
---------- ------------ --------------- ---------- --------- ------
Server10   1023.35      0               1          0         1
Server9    901.23       1               1          1         2
Server8    890.12       2               1          2         3
Server7    789.01       0               2          2         4
Server6    678.90       1               2          1         5
Server5    567.89       2               2          0         6
Server4    456.78       0               3          0         7
Server3    345.67       1               3          1         8
Server2    234.56       2               3          2         9
Server1    123.45       0               4          2         10


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan memiliki count() dalam klausa yang ada

  2. SQL:Pilih kolom dengan nilai NULL saja

  3. Pivot dan koma nilai yang dipisahkan

  4. Perbandingan string SQL, lebih besar dari dan lebih kecil dari operator

  5. Bagaimana cara menulis kolom kueri dinamis ke dalam baris di SQL Server?