首页 > 解决方案 > 基于值而不是计数的 ntile 函数

问题描述

我想得到 5 percentiles ,基于将一列分为 5 个相等部分的总和(百分位数中的人数不应该相同)

我尝试运行 ntile 函数,但它让我得到了基于计数的 ntile

select name, data_usg, 
NTILE(10) OVER(ORDER BY data_usg asc) AS Quartile_data
from 
dev_TECH_KPIS

我的桌子看起来像这样

Name    Data_usg
A         100
B         150
C         200
D         130
E         80
F         50
G         60
H         15
I         80
J         90
K         50
L         60
M         30
M         20

最终结果是将名称分配到群组中,每个群组的总数据使用量为 1115/5=223。

标签: sqloracle

解决方案


这类事情有窗口函数。. . 比如percentile_()函数。但是,我更喜欢手动进行计算:

select dtk.*,
       floor(running_data_usg / (total_data_usg + 1)) as quintile
from (select dtk.*, sum(data_usg) over () as total_data_usg,
             sum(data_usg) over (order by data_usg asc) as running_data_usg
      from dev_TECH_KPIS dtk
     ) dtk;

我发现手动计算几乎就像使用单个函数(两个函数而不是一个)一样简单。但它对处理关系和对百分位数定义的调整提供了更多控制。


推荐阅读