Как создать неравные децили / квартили на основе совокупной суммы столбца - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь создать набор данных, который выглядит следующим образом:

ID  Volume
ID9 7500
ID8 7000
ID2 6400
ID3 5800
ID6 5800
ID5 5200
ID4 1400
ID10 800
ID7 700
ID1 600

Это то, что я хочу произвести:

ID  Volume  %   CumSum  Quartile
ID9 7500    0.182038835 18.2%   1
ID8 7000    0.169902913 35.2%   2
ID2 6400    0.155339806 50.7%   3
ID3 5800    0.140776699 64.8%   3
ID6 5800    0.140776699 78.9%   4
ID5 5200    0.126213592 91.5%   4
ID4 1400    0.033980583 94.9%   4
ID10 800    0.019417476 96.8%   4
ID7 700 0.016990291 98.5%   4
ID1 600 0.014563107 100.0%  4

Я пробовал следующий код, но который просто создает квартили одинакового размера на основе идентификатора и объема:

SELECT ID,VOLUME, NTILE (4) OVER (ORDER BY VOLUME DESC) QUARTILE FROM MY_DATA
;

Ответы [ 2 ]

1 голос
/ 22 января 2020

Аналогично (с результатами Гордона), с ratio_to_report и case:

SQL> with temp as
  2    (select id,
  3            volume,
  4            round(ratio_to_report (volume) over (), 9) pct
  5     from test
  6    )
  7  select id,
  8         volume,
  9         pct,
 10         round(sum(pct) over (order by volume desc) * 100, 1) cumsum,
 11         --
 12         case when sum(pct) over (order by volume desc) <= 0.25 then 1
 13              when sum(pct) over (order by volume desc) <= 0.50 then 2
 14              when sum(pct) over (order by volume desc) <= 0.75 then 3
 15              else 4
 16         end quartile
 17  from temp
 18  order by volume desc;

ID       VOLUME        PCT CUMSUM   QUARTILE
---- ---------- ---------- ------ ----------
ID9        7500 ,182038835   18,2          1
ID8        7000 ,169902913   35,2          2
ID2        6400 ,155339806   50,7          3
ID3        5800 ,140776699   78,9          4
ID6        5800 ,140776699   78,9          4
ID5        5200 ,126213592   91,5          4
ID4        1400 ,033980583   94,9          4
ID10        800 ,019417476   96,8          4
ID7         700 ,016990291   98,5          4
ID1         600 ,014563107  100,0          4

10 rows selected.

SQL>
1 голос
/ 22 января 2020

Почему бы просто не использовать прямые сравнения?

SELECT ID, VOLUME, SUM(VOLUME) OVER (ORDER BY VOLUME DESC) as running_volume,
       SUM(VOLUME) OVER (ORDER BY VOLUME DESC) / SUM(VOLUME) OVER () as ratio,
       CEIL(4 * SUM(VOLUME) OVER (ORDER BY VOLUME DESC) / SUM(VOLUME) OVER ()) as quartile
FROM t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...