Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于值而非计数的ntile函数_Sql_Oracle - Fatal编程技术网

Sql 基于值而非计数的ntile函数

Sql 基于值而非计数的ntile函数,sql,oracle,Sql,Oracle,我想得到5个百分位数,基于一列被分成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 13

我想得到5个百分位数,基于一列被分成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。

这类事情有窗口函数。例如
百分位函数()。但是,我更喜欢手动进行计算:

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;
我发现手动计算几乎和使用单个函数(两个函数而不是一个函数)一样简单。但它在处理关系方面提供了更多的控制,并对百分位数的定义进行了调整