Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tạo các nhóm có kích thước đồng đều dựa trên tổng hợp

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;

Kết quả:

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

Một số giải thích:

Ý tưởng là sắp xếp dữ liệu giảm dần trên TotalSizeGB cột. Sau đó, cứ 3 hàng tuần tự được nhóm lại với nhau (cột AnotherGrp ) đầu tiên trong DESC đặt hàng và sau đó trong ASC đặt hàng (cột PseudoGroNumberGrpNumber ). Nếu nó được thực thi SELECT * FROM () y bảng dẫn xuất thì kết quả sẽ là:

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. Cách sao lưu tệp SQL Server 2014 Express Localdb (.mdf) theo chương trình

  2. Các nỗ lực kết nối SQL Server được ghi lại ở đâu?

  3. SQL Server 2008 - sử dụng cmd để xuất với tiêu đề thành .csv

  4. Điều gì xảy ra khi tôi đánh rơi khóa chính được phân cụm trong SQL 2005

  5. Không thể hủy quá trình khôi phục giao dịch SPID