导读:本期聚焦于小伙伴创作的《SQL查询如何实现分组内的百分比排名?使用PERCENT_RANK函数的方法是什么》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《SQL查询如何实现分组内的百分比排名?使用PERCENT_RANK函数的方法是什么》有用,将其分享出去将是对创作者最好的鼓励。

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

SQL查询如何实现分组内的百分比排名?使用PERCENT_RANK函数的方法是什么

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_idsalarypercent_rank
150000
360000.25
280000.5
480000.5
5100001

可以看到,薪资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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。