SQL查询百分位数间隔,但每个间隔的行数相等?

时间:2018-04-02 17:21:25

标签: mysql sql

我想为每一行指定一个索引/组编号,表明它属于哪个百分位数。例如,我现在的代码是:

SELECT User, Revenue,
       (int)(100*(PERCENT_RANK() OVER(ORDER BY Revenue)))/5 AS Percentile
FROM RevenueDistribution;

因此Percentile 0表示0-5%,1表示5-10%等。但是,使用等间隔时间意味着行数不均匀,因为第一个间隔的行数比其他因为数据中有许多行Revenue=0。例如,有Percentile=0的用户可能超过一百万,而Percentile=1,2,...的用户可能有几十万。

有没有办法分配这样的索引,但是每个区间的行数相等,而不是等间隔但行数不等?

1 个答案:

答案 0 :(得分:2)

根据您的描述,我认为您正在搜索 NTILE

  

NTILE(N)over_clause

     

将分区划分为N个组(存储桶),为分区中的每一行分配其存储桶编号,并返回其分区中当前行的存储区编号。例如,如果N为4,则NTILE()将行分为四分位数。如果N为100,则NTILE()将行划分为百分位数。

SELECT User, Revenue,
       NTILE(100) OVER(ORDER BY Revenue) AS bucket_num
FROM RevenueDistribution;