摘要:在本教程中,您将学习如何使用 SQL PERCENT_RANK()
函数计算结果集中行的百分位数排名。
PERCENT_RANK()
是一种 窗口函数,用于计算结果集中行的百分位数排名。
PERCENT_RANK()
函数的语法如下
PERCENT_RANK()
OVER (
PARTITION BY expr1, expr2,...
ORDER BY expr1 [ASC|DESC], expr2 ...
)
Code language: SQL (Structured Query Language) (sql)
PERCENT_RANK()
函数返回一个百分位数排名,其范围从零到一。
对于特定行,PERCENT_RANK()
使用以下公式计算百分位数排名
(rank - 1) / (total_rows - 1)
Code language: SQL (Structured Query Language) (sql)
在此公式中,rank
是行的排名。total_rows
是正在计算的行数。
根据此公式,PERCENT_RANK()
函数始终为结果集中的第一行返回零。
PARTITION BY
子句将行划分为分区,ORDER BY
子句为每个分区指定行逻辑顺序。PERCENT_RANK()
函数独立计算每个排序分区的百分比排名。
PARTITION BY
子句是可选的。如果您省略 PARTITION BY
子句,则该函数将整个结果集视为单个分区。
SQL PERCENT_RANK() 函数示例
我们将使用 示例数据库 中的 employees
和 departments
表进行演示。
使用 SQL PERCENT_RANK() 超出查询结果集示例
以下查询通过员工的薪资查找其百分位数排名
SELECT
first_name,
last_name,
salary,
ROUND(
PERCENT_RANK() OVER (
ORDER BY salary
)
,2) percentile_rank
FROM
employees;
Code language: SQL (Structured Query Language) (sql)
在此示例中,我们省略了 PARTITION BY
子句,因此函数将结果集中所有员工视为单个分区。请注意,我们使用 ROUND()
函数将百分位数排名四舍五入到两位小数。
下图显示了输出

ORDER BY
子句对员工薪资进行排序,PERCENT_RANK()
函数按升序计算员工按薪资的百分位数排名。
让我们分析输出中的一些行。
- Karen 薪资最低,不高于任何人,因此她的百分位数排名为零。另一方面,Steven 薪资最高,高于任何其他人,因此他的百分位数排名为 1 或 100%。
- Nancy 和 Shelley 的百分位数排名为 82%,这意味着他们的薪资高于其他所有员工的 82%。
使用 SQL PERCENT_RANK() 超过分区示例
以下语句返回员工按部门薪资的百分位数排名
SELECT
first_name,
last_name,
salary,
department_name,
ROUND(
PERCENT_RANK() OVER (
PARTITION BY e.department_id
ORDER BY salary
)
,2) percentile_rank
FROM
employees e
INNER JOIN departments d
ON d.department_id = e.department_id;
Code language: SQL (Structured Query Language) (sql)
以下是输出

在此示例中,我们按部门名称对员工进行划分。然后将 PERCENT_RANK()
应用于每个分区。
正如输出中清楚显示的一样,每当部门发生改变时,百分位数排名就会被重置。
在该教程中,您学习了如何使用 SQL PERCENT_RANK()
函数计算结果集中行的百分位数排名。