SQL Server 中的 RANK 函数

17 Mar 2025 | 6 分钟阅读

SQL Server 中的 RANK 函数是一种排名函数。此函数将**为输出分区内的每一行分配一个数字**。它为每一行分配的排名比前一行的排名加一。当 RANK 函数在同一分区内遇到两个相同的数值时,它会为它们分配相同的排名数字。此外,排名中的下一个数字将是前一个排名加上重复数字的数量。因此,此函数并不总是按连续顺序分配行的排名。

RANK 函数也是窗口函数的一个子集。**在使用此函数时应牢记以下几点**

  • 它始终与 OVER() 子句一起使用。
  • 它根据 ORDER BY 子句为每一行分配排名。
  • 它按连续顺序为每一行分配排名。
  • 它总是为行分配排名,每个新分区从一开始。

注意:Rank 在查询执行时为分区内的行分配临时值。

SQL Server 提供了以下排名函数:

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

让我们详细了解每个排名函数。首先,我们将创建一个表来演示所有这些函数。以下语句创建了一个名为 **rank_demo** 的三列表

接下来,我们将按如下方式向此表中插入一些行

我们可以使用 SELECT 语句验证表。它显示了以下输出

RANK Function in SQL Server

RANK() 函数

此函数用于确定结果集中文本中每一行的排名。以下语法说明了 SQL Server 中 RANK 函数的用法

在这个语法中,

  • OVER 子句 在将关联的窗口函数应用于之前,设置结果的分区和排序。
  • PARTITION BY 子句 将 FROM 子句产生的输出划分为分区。然后将函数应用于每个分区,并在跨越分区时重新初始化。如果我们没有定义此子句,函数会将所有行视为一个分区。
  • ORDER BY 是一个必需的子句,它在应用函数之前根据一个或多个列名以降序或升序确定行的顺序。

示例

让我们看看 RANK() 函数在 SQL Server 中是如何工作的。以下语句将使用 rank 函数为每一行分配编号

由于我们没有使用 PARTITION BY 子句,该函数将整个结果视为一个分区。执行该语句将显示以下输出

RANK Function in SQL Server

在此输出中,我们可以看到一些行获得相同的排名,因为它们在 city 列 中具有相同的值。排名中的下一个数字将是其前一个排名加上重复数字的数量。

以下语句是**另一个示例**,我们将使用 partition by 子句,它将根据 city 列 对行进行分区,并为每个分区内的行分配排名。输出顺序基于 first_name

它将显示以下输出:

RANK Function in SQL Server

ROW_NUMBER() 函数

此函数用于**为其分区内的每一行返回唯一的顺序编号**。行编号从一开始,并增加一,直到达到分区的总行数。它将为具有相同值的行返回不同的排名,这使其与 RANK() 函数不同。

以下语法说明了 SQL Server 中 ROW_NUMBER() 函数的用法

示例

执行以下查询为每一行分配一个顺序号

它将根据其 city 为表分配排名。在这里,我们可以看到它为具有相同 city 值的行分配了不同的排名。

RANK Function in SQL Server

如果我们更改 ORDER BY 子句的排序顺序,从升序到降序,该函数也会相应地更改排名。请参阅以下语句

这是结果:

RANK Function in SQL Server

DENSE_RANK() 函数

此函数根据指定的列值,为分区内的每一行分配**唯一的排名,没有任何间隔**。它始终按顺序指定排名。如果我们得到一个**重复值**,此函数将为其分配相同的排名,而下一个排名将是下一个顺序号。此特性使 DENSE_RANK() 函数与 RANK() 函数区分开来。

以下语法说明了 SQL Server 中 DENSE_RANK() 函数的用法

示例

以下查询使用 DENSE_RANK() 函数为每一行分配排名编号

它将返回以下输出,其中我们可以看到重复值具有相同的排名,而下一个排名将是下一个顺序号。

RANK Function in SQL Server

这是 DENSE_RANK() 函数使用 PARTITION BY 子句的另一个示例。此子句将根据 city 列对行进行分区,并且结果集的顺序基于 first_name

我们将得到以下输出,因为没有两个名字是相同的。在这种情况下,输出与 RANK() 函数类似。

RANK Function in SQL Server

让我们使用以下查询更新名称

现在,再次执行相同的查询。我们将看到此表在 California City 中有相同的名字。因此,两个名字的排名也相同。

RANK Function in SQL Server

NTILE(N) 函数

此函数用于将**有序分区的行分布到预定义的数量** (N) 的近似相等组中。每个行组根据定义的条件获得其排名,并从一个组开始编号。它为属于该组的每个行分配一个**存储桶编号**,表示它所属的组。

以下语法说明了 SQL Server 中 NTILE() 函数的用法

示例

以下查询使用 NTILE() 函数为每一行分配排名编号

指定的表有八条记录。因此,NTILE(3) 表示结果集必须有三条记录的组。执行该语句将显示以下输出

RANK Function in SQL Server

本文将通过各种示例解释 SQL Server 中使用的所有 RANK 函数。它还显示了这些函数之间的主要区别。这些函数对于开发人员探索和有效管理他们的数据非常有用。


下一主题SQL Server PIVOT