本文详细解析了SQL排名函数RANK的用法,从基础语法结构入手,结合实战案例进行深入讲解,内容涵盖了RANK函数的具体应用场景,采用绝对引用的方式辅助说明,旨在帮助读者一文看懂并掌握RANK函数在数据排名中的实际操作技巧。
在数据处理和SQL查询中,我们经常需要对数据进行排序并赋予名次,计算班级学生的成绩排名、公司销售员的业绩排行榜等,这时,SQL窗口函数中的 RANK() 就是一个非常强大的工具。
很多初学者在使用 RANK() 时容易混淆它与 ROW_NUMBER() 或 DENSE_RANK() 的区别,本文将详细介绍 RANK() 函数的语法、核心特性以及通过实战案例让你彻底掌握“排名函数rank怎么用”。
什么是 RANK() 函数?
RANK() 是一个窗口函数,用于为结果集中的每一行分配一个排名,它的核心逻辑是:如果有并列名次(即排序字段值相同),则它们排名相同,且随后的排名会跳过序号。
如果有两个人并列第1名,那么下一个人的名次就是第3名(而不是第2名)。
语法结构
使用 RANK() 函数时,必须搭配 OVER() 子句使用,基本语法如下:
RANK() OVER (
PARTITION BY 分组字段1, 分组字段2...
ORDER BY 排序字段1 [ASC|DESC], 排序字段2...
)
- PARTITION BY(可选): 用于将结果集分组,如果指定了分组,排名将在每个组内独立计算;如果省略,则对整个结果集进行排名。
- ORDER BY(必填): 定义排名的依据字段,指定是升序(ASC)还是降序(DESC)。
核心特性:并列与跳号
这是理解 RANK() 的关键,让我们对比一下常见的三种排名逻辑:
- ROW_NUMBER(): 1, 2, 3, 4(不管分数是否相同,连续唯一数字)
- RANK(): 1, 2, 2, 4(分数相同则排名相同,跳过第3名)
- DENSE_RANK(): 1, 2, 2, 3(分数相同则排名相同,不跳过第3名)
如果你希望“并列之一,下一名是第三”,请使用 RANK()。
实战案例:学生成绩排名
假设我们有一张学生成绩表 student_scores,数据如下:
| id | name | subject | score |
|---|---|---|---|
| 1 | 小明 | 数学 | 100 |
| 2 | 小红 | 数学 | 90 |
| 3 | 小刚 | 数学 | 90 |
| 4 | 小强 | 数学 | 80 |
| 5 | 小丽 | 英语 | 95 |
基础用法:全班总排名
我们要求数学成绩从高到低排名,看看 RANK() 是怎么处理并列的。
SELECT
name,
score,
RANK() OVER (ORDER BY score DESC) as ranking
FROM
student_scores
WHERE
subject = '数学';
查询结果:
| name | score | ranking |
|---|---|---|
| 小明 | 100 | 1 |
| 小红 | 90 | 2 |
| 小刚 | 90 | 2 |
| 小强 | 80 | 4 |
解析: 小红和小刚都是90分,并列第2名,注意观察小强的排名,直接跳到了 4,这就是 RANK() 的特性。
进阶用法:分组排名 (PARTITION BY)
如果我们不仅想看排名,还想按照“科目”进行分组排名(即数学排数学的,英语排英语的),就需要加上 PARTITION BY。
SELECT
name,
subject,
score,
RANK() OVER (PARTITION BY subject ORDER BY score DESC) as subject_ranking
FROM
student_scores;
查询结果:
| name | subject | score | subject_ranking |
|---|---|---|---|
| 小明 | 数学 | 100 | 1 |
| 小红 | 数学 | 90 | 2 |
| 小刚 | 数学 | 90 | 2 |
| 小强 | 数学 | 80 | 4 |
| 小丽 | 英语 | 95 | 1 |
解析: 通过 PARTITION BY subject,数学和英语的排名被隔离开来,互不干扰。
常见应用场景
-
取前N名(Top N): 获取每个科目成绩的前3名,由于
RANK()有跳号特性,如果有多人并列第2名,使用WHERE ranking <= 3可能会选出超过3个人,如果严格只要3个人,建议用ROW_NUMBER();如果要包含所有并列第3名的人,用RANK()或DENSE_RANK()。WITH RankedScores AS ( SELECT name, subject, score, RANK() OVER (PARTITION BY subject ORDER BY score DESC) as rnk FROM student_scores ) SELECT * FROM RankedScores WHERE rnk <= 3; -
计算奖金阶梯: 根据销售业绩排名发放奖金,排名相同则奖金相同,
RANK()非常适用。
排名函数rank怎么用? 记住以下三点即可:
- 语法:
RANK() OVER (PARTITION BY ... ORDER BY ...)。 - 特性: 遇到相同数值,排名相同;遇到不同数值,排名跳跃(1, 2, 2, 4)。
- 场景: 适用于 Olympics 排名、业绩排行榜等对并列名次有严格“跳号”要求的场景。
掌握了 RANK(),再结合 DENSE_RANK()(密集排名)和 ROW_NUMBER()(行号),你就能轻松应对SQL中绝大多数的排序需求了。
