本文详细解析了SQL排名函数RANK的用法,从基础语法结构入手,结合实战案例进行深入讲解,内容涵盖了RANK函数的具体应用场景,采用绝对引用的方式辅助说明,旨在帮助读者一文看懂并掌握RANK函数在数据排名中的实际操作技巧。

在数据处理和SQL查询中,我们经常需要对数据进行排序并赋予名次,计算班级学生的成绩排名、公司销售员的业绩排行榜等,这时,SQL窗口函数中的 RANK() 就是一个非常强大的工具。

很多初学者在使用 RANK() 时容易混淆它与 ROW_NUMBER()DENSE_RANK() 的区别,本文将详细介绍 RANK() 函数的语法、核心特性以及通过实战案例让你彻底掌握“排名函数rank怎么用”。

SQL排名函数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() 的关键,让我们对比一下常见的三种排名逻辑:

  1. ROW_NUMBER(): 1, 2, 3, 4(不管分数是否相同,连续唯一数字)
  2. RANK(): 1, 2, 2, 4(分数相同则排名相同,跳过第3名)
  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,数学和英语的排名被隔离开来,互不干扰。

常见应用场景

  1. 取前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;
  2. 计算奖金阶梯: 根据销售业绩排名发放奖金,排名相同则奖金相同,RANK() 非常适用。

排名函数rank怎么用? 记住以下三点即可:

  1. 语法: RANK() OVER (PARTITION BY ... ORDER BY ...)
  2. 特性: 遇到相同数值,排名相同;遇到不同数值,排名跳跃(1, 2, 2, 4)。
  3. 场景: 适用于 Olympics 排名、业绩排行榜等对并列名次有严格“跳号”要求的场景。

掌握了 RANK(),再结合 DENSE_RANK()(密集排名)和 ROW_NUMBER()(行号),你就能轻松应对SQL中绝大多数的排序需求了。