在SQL数据处理过程中,分组内的百分比排名是一个常见的需求,比如统计每个部门员工薪资在部门内的相对位置,或者计算每个班级学生成绩在班级内的排名占比。PERCENT_RANK函数是SQL标准中提供的窗口函数,专门用于计算行在分区内的百分比排名,能够简化这类需求的实现逻辑。

PERCENT_RANK函数基本语法
PERCENT_RANK函数的语法格式如下,它属于窗口函数的一种,需要和OVER子句配合使用:
PERCENT_RANK() OVER (
[PARTITION BY 分区列]
ORDER BY 排序列 [ASC|DESC]
)
其中各个部分的含义如下:
- PARTITION BY:可选参数,用于指定分组的列,如果不指定则将所有数据作为一个整体分组
- ORDER BY:必填参数,用于指定排序的列,百分比排名会根据该列的排序结果计算
PERCENT_RANK的计算规则
PERCENT_RANK的计算公式为:(组内当前行的排名 - 1) / (组内总行数 - 1),计算结果的区间是[0,1],其中排名是从1开始计算的,相同值的行会获得相同的排名。
这里需要注意两个特殊情况:
- 如果组内只有1行数据,分母为0,此时PERCENT_RANK的结果为0
- 排名第一的行,计算结果为(1-1)/(n-1)=0,排名最后的行,计算结果为(n-1)/(n-1)=1
单分组场景示例
假设有一张员工薪资表emp_salary,包含员工ID和薪资两个字段,现在需要计算所有员工薪资的百分比排名:
-- 创建测试表
CREATE TABLE emp_salary (
emp_id INT,
salary DECIMAL(10,2)
);
-- 插入测试数据
INSERT INTO emp_salary VALUES (1, 5000);
INSERT INTO emp_salary VALUES (2, 8000);
INSERT INTO emp_salary VALUES (3, 6000);
INSERT INTO emp_salary VALUES (4, 8000);
INSERT INTO emp_salary VALUES (5, 10000);
执行以下查询语句,计算所有员工的薪资百分比排名:
SELECT
emp_id,
salary,
PERCENT_RANK() OVER (ORDER BY salary ASC) AS percent_rank
FROM emp_salary;
查询结果如下:
| emp_id | salary | percent_rank |
|---|---|---|
| 1 | 5000 | 0 |
| 3 | 6000 | 0.25 |
| 2 | 8000 | 0.5 |
| 4 | 8000 | 0.5 | >
| 5 | 10000 | 1 |
可以看到,薪资5000的员工排名第一,百分比排名为0;薪资8000的两个员工排名都是3,百分比排名为(3-1)/(5-1)=0.5;薪资10000的员工排名最后,百分比排名为1。
多分组场景示例
如果员工表还包含部门ID字段,需要计算每个部门内员工薪资的百分比排名,只需要添加PARTITION BY子句即可:
-- 新增部门字段的测试表
CREATE TABLE emp_salary_dept (
emp_id INT,
dept_id INT,
salary DECIMAL(10,2)
);
-- 插入测试数据
INSERT INTO emp_salary_dept VALUES (1, 1, 5000);
INSERT INTO emp_salary_dept VALUES (2, 1, 8000);
INSERT INTO emp_salary_dept VALUES (3, 1, 6000);
INSERT INTO emp_salary_dept VALUES (4, 2, 7000);
INSERT INTO emp_salary_dept VALUES (5, 2, 9000);
INSERT INTO emp_salary_dept VALUES (6, 2, 7000);
执行以下查询,按部门分组计算薪资百分比排名:
SELECT
emp_id,
dept_id,
salary,
PERCENT_RANK() OVER (PARTITION BY dept_id ORDER BY salary ASC) AS dept_percent_rank
FROM emp_salary_dept;
部门1有3名员工,薪资分别是5000、6000、8000,对应的百分比排名分别是0、(2-1)/(3-1)=0.5、1;部门2有3名员工,薪资分别是7000、7000、9000,对应的百分比排名分别是0、0、(3-1)/(3-1)=1。
使用注意事项
- PERCENT_RANK是标准SQL函数,大部分主流数据库如MySQL 8.0+、PostgreSQL、SQL Server、Oracle都支持,但是低版本的MySQL(5.x系列)不支持该函数,需要手动计算
- 排序方式会影响百分比排名的结果,需要根据业务需求选择升序还是降序,比如薪资场景如果要统计高薪资的排名占比,可以使用ORDER BY salary DESC
- 和PERCENT_RANK类似的还有CUME_DIST函数,CUME_DIST计算的是小于等于当前值的行数占总行数的比例,区间是(0,1],和PERCENT_RANK的计算逻辑有区别,使用时需要注意区分
手动计算百分比排名的参考逻辑:先给每个分组的行计算排名,再计算(排名-1)/(分组总行数-1),不过使用PERCENT_RANK函数可以大幅简化代码,减少出错概率。
SQLPERCENT_RANK分组百分比排名窗口函数修改时间:2026-07-15 07:48:24