Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Създавайте групи с еднакъв размер въз основа на съвкупност

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;

Резултати:

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

Някои пояснения:

Идеята е да сортирате данните в низходящ ред на TotalSizeGB колона. След това всеки 3 последователни реда се групират заедно (колона AnotherGrp ) първо в DESC ред и след това в ASC ред (колона PseudoGroNumber и GrpNumber ). Ако се изпълни SELECT * FROM () y производна таблица, тогава резултатите ще бъдат:

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. Интегриране на SQL Service Broker и NServiceBus

  2. Грешка в sql заявка Неправилен синтаксис близо до

  3. Системни бази данни на SQL Server – Основни понятия

  4. Изберете, модифицирайте и вмъкнете в същата таблица

  5. Как да върна 1 единичен ред данни от 2 различни таблици с динамично съдържание в sql