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

SQL窗口函数中的RANK和DENSE_RANK是处理分组排名需求的核心函数,二者都基于over子句定义的分组和排序规则生成排名,但在遇到相同值时的排名逻辑有所不同,适用于不同的业务场景。

SQL窗口函数如何实现分组排名 RANK与DENSE_RANK用法详解

RANK与DENSE_RANK基本语法

两个函数的语法结构完全一致,都需要配合OVER()子句使用,OVER()中通过PARTITION BY指定分组字段,通过ORDER BY指定排序字段,语法如下:

-- RANK函数语法
RANK() OVER (PARTITION BY 分组字段 ORDER BY 排序字段 [ASC|DESC])

-- DENSE_RANK函数语法
DENSE_RANK() OVER (PARTITION BY 分组字段 ORDER BY 排序字段 [ASC|DESC])

分组排名实现示例

假设我们有一张学生成绩表student_score,包含学生ID、班级ID、学科、成绩四个字段,现在需要按班级分组,对每个班级内的学生成绩进行降序排名,分别使用RANK和DENSE_RANK实现。

首先创建测试表并插入测试数据:

-- 创建学生成绩表
CREATE TABLE student_score (
    student_id INT,
    class_id INT,
    subject VARCHAR(20),
    score INT
);

-- 插入测试数据
INSERT INTO student_score VALUES
(1, 1, '数学', 95),
(2, 1, '数学', 95),
(3, 1, '数学', 90),
(4, 1, '数学', 88),
(5, 2, '数学', 92),
(6, 2, '数学', 92),
(7, 2, '数学', 85);

使用RANK函数实现分组排名

执行以下SQL语句,按班级分组,数学成绩降序排名:

SELECT
    student_id,
    class_id,
    score,
    RANK() OVER (PARTITION BY class_id ORDER BY score DESC) AS rank_num
FROM student_score
WHERE subject = '数学';

执行结果如下:

student_idclass_idscorerank_num
11951
21951
31903
41884
52921
62921
72853

使用DENSE_RANK函数实现分组排名

执行以下SQL语句,同样按班级分组,数学成绩降序排名:

SELECT
    student_id,
    class_id,
    score,
    DENSE_RANK() OVER (PARTITION BY class_id ORDER BY score DESC) AS dense_rank_num
FROM student_score
WHERE subject = '数学';

执行结果如下:

student_idclass_idscoredense_rank_num
11951
21951
31902
41883
52921
62921
72852

二者核心差异对比

通过上面的示例可以清晰看到两个函数的排名规则差异:

  • RANK函数:遇到相同值时排名相同,下一个不同值的排名会跳过重复的排名数量,比如两个第1名之后,下一个排名是第3名。
  • DENSE_RANK函数:遇到相同值时排名相同,下一个不同值的排名不会跳过,比如两个第1名之后,下一个排名是第2名。

适用场景说明

在实际业务中,需要根据需求选择合适的函数:

  • 如果需要统计竞赛排名,允许并列后跳过名次,比如两个第一名之后没有第二名,直接是第三名,就使用RANK函数。
  • 如果需要统计等级排名,比如成绩分为A、B、C三个等级,相同分数属于同一等级,下一个等级连续不跳过,就使用DENSE_RANK函数。
注意:如果不需要分组,只需要全局排序排名,可以省略OVER()子句中的PARTITION BY部分,只保留ORDER BY即可。

SQL窗口函数RANKDENSE_RANK分组排名over子句修改时间:2026-07-07 15:15:33

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