SQL Server 中的 RANK 函数17 Mar 2025 | 6 分钟阅读 SQL Server 中的 RANK 函数是一种排名函数。此函数将**为输出分区内的每一行分配一个数字**。它为每一行分配的排名比前一行的排名加一。当 RANK 函数在同一分区内遇到两个相同的数值时,它会为它们分配相同的排名数字。此外,排名中的下一个数字将是前一个排名加上重复数字的数量。因此,此函数并不总是按连续顺序分配行的排名。 RANK 函数也是窗口函数的一个子集。**在使用此函数时应牢记以下几点**
注意:Rank 在查询执行时为分区内的行分配临时值。SQL Server 提供了以下排名函数:
让我们详细了解每个排名函数。首先,我们将创建一个表来演示所有这些函数。以下语句创建了一个名为 **rank_demo** 的三列表 接下来,我们将按如下方式向此表中插入一些行 我们可以使用 SELECT 语句验证表。它显示了以下输出 ![]() RANK() 函数此函数用于确定结果集中文本中每一行的排名。以下语法说明了 SQL Server 中 RANK 函数的用法 在这个语法中,
示例让我们看看 RANK() 函数在 SQL Server 中是如何工作的。以下语句将使用 rank 函数为每一行分配编号 由于我们没有使用 PARTITION BY 子句,该函数将整个结果视为一个分区。执行该语句将显示以下输出 ![]() 在此输出中,我们可以看到一些行获得相同的排名,因为它们在 city 列 中具有相同的值。排名中的下一个数字将是其前一个排名加上重复数字的数量。 以下语句是**另一个示例**,我们将使用 partition by 子句,它将根据 city 列 对行进行分区,并为每个分区内的行分配排名。输出顺序基于 first_name 它将显示以下输出: ![]() ROW_NUMBER() 函数此函数用于**为其分区内的每一行返回唯一的顺序编号**。行编号从一开始,并增加一,直到达到分区的总行数。它将为具有相同值的行返回不同的排名,这使其与 RANK() 函数不同。 以下语法说明了 SQL Server 中 ROW_NUMBER() 函数的用法 示例执行以下查询为每一行分配一个顺序号 它将根据其 city 为表分配排名。在这里,我们可以看到它为具有相同 city 值的行分配了不同的排名。 ![]() 如果我们更改 ORDER BY 子句的排序顺序,从升序到降序,该函数也会相应地更改排名。请参阅以下语句 这是结果: ![]() DENSE_RANK() 函数此函数根据指定的列值,为分区内的每一行分配**唯一的排名,没有任何间隔**。它始终按顺序指定排名。如果我们得到一个**重复值**,此函数将为其分配相同的排名,而下一个排名将是下一个顺序号。此特性使 DENSE_RANK() 函数与 RANK() 函数区分开来。 以下语法说明了 SQL Server 中 DENSE_RANK() 函数的用法 示例以下查询使用 DENSE_RANK() 函数为每一行分配排名编号 它将返回以下输出,其中我们可以看到重复值具有相同的排名,而下一个排名将是下一个顺序号。 ![]() 这是 DENSE_RANK() 函数使用 PARTITION BY 子句的另一个示例。此子句将根据 city 列对行进行分区,并且结果集的顺序基于 first_name 我们将得到以下输出,因为没有两个名字是相同的。在这种情况下,输出与 RANK() 函数类似。 ![]() 让我们使用以下查询更新名称 现在,再次执行相同的查询。我们将看到此表在 California City 中有相同的名字。因此,两个名字的排名也相同。 ![]() NTILE(N) 函数此函数用于将**有序分区的行分布到预定义的数量** (N) 的近似相等组中。每个行组根据定义的条件获得其排名,并从一个组开始编号。它为属于该组的每个行分配一个**存储桶编号**,表示它所属的组。 以下语法说明了 SQL Server 中 NTILE() 函数的用法 示例 以下查询使用 NTILE() 函数为每一行分配排名编号 指定的表有八条记录。因此,NTILE(3) 表示结果集必须有三条记录的组。执行该语句将显示以下输出 ![]() 本文将通过各种示例解释 SQL Server 中使用的所有 RANK 函数。它还显示了这些函数之间的主要区别。这些函数对于开发人员探索和有效管理他们的数据非常有用。 下一主题SQL Server PIVOT |
我们请求您订阅我们的新闻通讯以获取最新更新。