sql - 基于值而不是计数的 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。
解决方案
这类事情有窗口函数。. . 比如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;
我发现手动计算几乎就像使用单个函数(两个函数而不是一个)一样简单。但它对处理关系和对百分位数定义的调整提供了更多控制。