PERCENT_RANK返回0到1间的相对位置而非百分比,首行为0.0、末行为1.0,公式为(n-1)/(total_rows-1);需配合PARTITION BY分组、ORDER BY DESC使用,并注意NULL处理、与NTILE/CUME_DIST的区别及业务语义误读风险。

PERCENT_RANK 返回的是相对位置(0 到 1 之间),不是“前 X%”,也不是四舍五入后的整数百分比——直接用它做业绩达标判定或可视化时,容易误读。
PERCENT_RANK 的计算逻辑和边界值行为
它按 ORDER BY 排序后,对第 n 行返回 (n-1) / (total_rows - 1)。这意味着:第一行永远是 0.0,最后一行永远是 1.0(哪怕只有一行,也返回 0.0)。
- 如果有 5 条销售记录,排名第 3 的员工,
PERCENT_RANK是(3-1)/(5-1) = 0.5,即“位于中间位置”,不是“超过 50% 的人” - 并列情况会得到相同值:若两人并列第 2(实际占第 2、3 位),他们的
PERCENT_RANK都是(2-1)/(5-1) = 0.25,而非分别算 0.25 和 0.5 - 空值(
NULL)默认排在最前,影响分母和分子——建议显式用WHERE sales_amount IS NOT NULL过滤
按区域分组计算业绩百分比排名
销售数据常需按部门或区域独立排名。必须用 PARTITION BY,否则全表混排失去业务意义。
SELECT
region,
employee_name,
sales_amount,
PERCENT_RANK() OVER (
PARTITION BY region
ORDER BY sales_amount DESC
) AS pct_rank
FROM sales;-
PARTITION BY region确保华东、华南各自算分母,避免把华南垫底员工排到全公司前 10% -
ORDER BY sales_amount DESC是关键:业绩越高,PERCENT_RANK越小(因为排前面,n 小),符合“排名靠前=表现好”的直觉 - 如果用
ASC,最高业绩者反而得1.0,后续筛选或着色易出错
与 NTILE 或 CUME_DIST 混用的常见误区
有人想“把销售员分成前 20%、中间 60%、后 20%”,直接套 PERCENT_RANK < 0.2 是错的——它只表示“位置在 20% 分位点之前”,不保证人数精确占比。
-
NTILE(5) OVER (...)才能强制均分五组(但可能因总数不能整除而出现 4/5/6 人不等) -
CUME_DIST()返回“≤当前值的比例”,比如并列第 2 名时,CUME_DIST是 0.4(含前两名),而PERCENT_RANK是 0.25;两者语义不同,别混用 - 导出到 Excel 做仪表盘时,
PERCENT_RANK值需乘以 100 并ROUND(..., 2)再显示为“92.31%”,否则小数显示不友好
真正要注意的是:业务方常把“PERCENT_RANK = 0.95”理解成“超过 95% 的人”,但它实际只说明该员工在排序中处于倒数第 5% 的位置——是否并列、是否去重、是否排除异常单(如退款订单),这些清洗动作必须在 OVER 子句之前完成,否则结果不可解释。

















