SQL RANK 函数

17 Mar 2025 | 6 分钟阅读

RANK 是标准查询语言 (SQL) 中的一个分析函数或窗口函数,它根据查询运行时指定的列值指示结果集中每行的位置。

RANK 函数用于对表中存在的数据进行排名,例如,根据百分比对学生排名,根据薪资对员工排名等。

进行排名时,它会为输出显示的每一行分配一个数字。排名按连续顺序给出,即 1、2、3、4 等。如果有多行相同,RANK() 函数会为它们提供相同的排名;例如,如果两个学生获得相同的百分比,他们将获得相同的排名。

在使用 rank 函数时必须记住以下几点

  • 使用 OVER() 子句是强制性的,因为 RANK() 函数需要与 OVER() 子句一起使用。
  • 它根据 ORDER BY 子句对每一行进行排名。
  • 它从每个新分区开始,使用整数 1 对行进行排名。
  • 它以连续的顺序为每一行进行排名,即 1、2、3、4 等。
  • 如果多行相同,则为这些行提供相同的排名。但在这种情况下,下一个不相等的行将通过在前一个排名中加上重复项的数量来获得排名。

下面是 SQL 中使用 RANK() 函数的语法

在上面的语法中,

  • RANK() 函数与 OVER() 子句一起使用。
  • PARTITION BY 子句将 FROM 子句获得的结果集分割成若干个分区。使用 PARTITION BY 子句不是强制性的。
  • ORDER BY 子句用于根据列名以降序或升序排列对行进行排序。

标准查询语言 (SQL) 中有各种排名函数,如下所示

  • RANK()
  • ROW_NUMBER()
  • DENSE_RANK()
  • NTILE()

我们将通过示例逐一讨论它们。

RANK 函数示例

首先,我们将创建一个将在其中进行操作的示例表。

我们将创建一个名为 student_table 的表,其中包含 stu_name、stu_age、stu_address、stu_subject 和 stu_marks 的详细信息。

创建表

下面的代码将创建一个空表。

空表将显示如下。

SQL RANK Function

向表中插入数据

下面的代码将向表中插入数据。

如您所见,数据已插入,并且表如下所示

stu_namestu_agestu_addressstu_subjectstu_marks
Anthony20AustinAI82
James20ChicagoDAA82
海伦21PhoenixEC75
Nicole19ChicagoDAA73
丹尼尔22ColumbusAI85
Shirley21AustinDAA86
彼得22PhoenixAI72
John23WashingtonDAA89
Nick23ColumbusEC73
Ashley21WashingtonDBMS71

示例 1:SQL 中不使用 PARTITION BY 子句的 RANK() 函数

在此示例中,我们将根据分数对学生进行排名。为此,我们将使用下面的代码。

输入

输出

正如您在输出中看到的,学生根据其分数获得了排名。分数相同的学生获得相同的排名,但在此之后,下一个学生将通过在之前的排名中加上重复项的数量来获得排名。

stu_namestu_agestu_addressstu_subjectstu_marks位置
John23WashingtonDAA891
Shirley21AustinDAA862
丹尼尔22ColumbusAI853
Anthony20AustinAI824
James20ChicagoDAA824
海伦21PhoenixEC756
Nicole19ChicagoDAA737
Nick23ColumbusEC737
彼得22PhoenixAI729
Ashley21WashingtonDBMS7110

示例 2:SQL 中使用 PARTITION BY 子句的 RANK() 函数

在此示例中,我们将使用 PARTITION BY 子句将学科分成若干分区,然后使用 ORDER BY 子句按分数降序对学生进行排名。

我们将使用下面的代码为学生进行排名,

输入

输出

正如您在输出中看到的,学生已根据其分数按学科进行了排名。

stu_namestu_agestu_addressstu_subjectstu_marks位置
丹尼尔22ColumbusAI851
Anthony20AustinAI822
彼得22PhoenixAI723
John23WashingtonDAA891
Shirley21AustinDAA862
James20ChicagoDAA823
Nicole19ChicagoDAA734
Ashley21WashingtonDBMS711
海伦21PhoenixEC751
Nick23ColumbusEC732

示例 3:SQL 中的 ROW_NUMBER() RANK 函数

在此示例中,我们将理解如何使用 ROW_NUMBER() RANK 函数。

ROW_NUMBER() 为每一行分配一个唯一的排名,这意味着即使两个学生具有相同的分数,它们也会获得唯一的排名。ROW_NUMBER() 函数的语法几乎与 RANK() 函数相同。

下面的代码将展示 ROW_NUMBER() 函数的用法——

输入

输出

正如您在输出中看到的,每一行都被分配了不同的排名。

stu_namestu_agestu_addressstu_subjectstu_marks位置
John23WashingtonDAA891
Shirley21AustinDAA862
丹尼尔22ColumbusAI853
Anthony20AustinAI824
James20ChicagoDAA825
海伦21PhoenixEC756
Nicole19ChicagoDAA737
Nick23ColumbusEC738
彼得22PhoenixAI729
Ashley21WashingtonDBMS7110

示例 4:SQL 中的 DENSE_RANK() 函数

在此示例中,我们将理解如何使用 DENSE_RANK() 函数。

DENSE_RANK() 用于为每一行分配唯一的排名。如果两个学生具有相同的分数,它会为两者分配相同的排名。DENSE_RANK() 函数的语法几乎与 RANK() 函数的语法相同。下面的代码将展示 DENSE_RANK() 函数的用法——

输入

输出

输出清楚地表明,当学生因相同分数获得相同排名时,下一个排名不会被跳过。相反,它提供下一个连续的整数。

stu_namestu_agestu_addressstu_subjectstu_marks位置
John23WashingtonDAA891
Shirley21AustinDAA862
丹尼尔22ColumbusAI853
Anthony20AustinAI824
James20ChicagoDAA824
海伦21PhoenixEC755
Nicole19ChicagoDAA736
Nick23ColumbusEC736
彼得22PhoenixAI727
Ashley21WashingtonDBMS718

示例 5:SQL 中的 NTILE(N) RANK 函数

在此示例中,我们将学习使用 NLITE(N) RANK 函数。

NTILE(N) 将行分成若干组,并为每一行分配一个组号。'N' 表示组的数量。NLITE(N) 函数的语法与 RANK() 函数几乎相同。

下面的代码将展示 NTILE(N) 函数的用法——

输入

输出

从输出可以看出,行被分成了三组。

stu_namestu_agestu_addressstu_subjectstu_marks群组
John23WashingtonDAA891
Shirley21AustinDAA861
丹尼尔22ColumbusAI851
Anthony20AustinAI821
James20ChicagoDAA822
海伦21PhoenixEC752
Nicole19ChicagoDAA732
Nick23ColumbusEC733
彼得22PhoenixAI723
Ashley21WashingtonDBMS713

结论

在本文中,您已经了解了 SQL RANK 函数以及各种示例。它是一个为表中每一行分配排名的函数。您还了解了不同的 RANK 函数,它们是 DENSE_RANK()、ROW_NUMBER()、RANK() 和 NTILE(N) 排名函数。


下一个主题SQL 中重命名列名