我想为每一行指定一个索引/组编号,表明它属于哪个百分位数。例如,我现在的代码是:
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,...
的用户可能有几十万。
有没有办法分配这样的索引,但是每个区间的行数相等,而不是等间隔但行数不等?
答案 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;