SQL Server 行号

17 Mar 2025 | 4 分钟阅读

行号是 SQL Server 中最常用的排名函数。ROW_NUMBER() 函数为结果输出中的每个分区内的每一行生成一个顺序号。在每个分区中,第一行的编号从 1 开始。我们必须始终使用 ORDER BY 子句来确保这些数字按正确的顺序分配。此函数返回的值为 BIG INT 数据类型。此函数与 SQL Server 2005 和更高版本的 MS SQL 版本一起提供。

ROW_NUMBER 确定查询执行时临时值。如果您想在表中获取数字,您需要查看 IDENTITY 属性和 SEQUENCE。当 SQL Server 中的 ROW_NUMBER 函数在同一分区中遇到两个相同的值时,它会为它们分配不同的排名号。排名号将由它们显示的顺序决定。

不能保证此函数返回的值每次执行的顺序都相同,除非满足以下条件

  • 分区列值是唯一的
  • ORDER BY 列值是唯一的
  • 分区和 Order By 列的组合是唯一的

语法

以下是说明 ROW_NUMBER() 函数的语法

让我们了解 ROW NUMBER() 函数的语法

OVER

了解此子句很重要,该子句指定窗口或窗口函数操作的行集。PARTITION BY 和 ORDER BY 是 OVER 子句的两个可能子句。当行必须以特定顺序出现才能执行函数时,支持 OVER 子句的 ORDER BY 表达式。

PARTITION BY

  • 这是一个可选子句,它将结果集分成多个分区(行组)。然后将 ROW NUMBER() 函数应用于每个分区,并分别分配每个分区的排名号。
  • 如果我们省略 partition by 子句,则 ROW_NUMBER 函数会将整个结果视为一个分区,并从上到下提供排名。

ORDER BY

此子句允许我们对每个分区内的结果集中的行进行排序。这是一个必需的子句,因为 ROW_NUMBER() 函数是依赖于顺序的。

示例

让我们通过一个示例了解 ROW_NUMBER 函数在 SQL Server 表中的工作方式。首先,我们将使用下面的语句创建一个名为“Persons”的表

接下来,我们将使用下面的语句将一些记录添加到此表中

接下来,使用 SELECT 语句验证数据。我们将得到以下输出

SQL Server Row Number

1. 简单的 ROW_NUMBER() 示例

以下语句显示人员的详细信息,并通过使用 ROW_NUMBER() 为每一行添加一个顺序整数

在这里,我们没有指定 PARTITION BY 子句,以便 ROW_NUMBER() 函数将整个结果集视为一个分区。执行该语句后,我们将得到以下输出

SQL Server Row Number

2. ROW_NUMBER() 在分区示例上

此示例中使用的 ROW NUMBER() 函数为表中的每个分区内的每个记录提供一个顺序号。当年份发生变化时,它总是会重新初始化行号

在这里,我们使用了 PARTITION BY 子句,该子句根据“年份”列将“Persons”表划分为多个分区。执行后,我们将得到以下输出

SQL Server Row Number

3. ROW_NUMBER() 用于分页的示例

我们也可以将 ROW_NUMBER() 函数用于分页。例如,如果我们想通过页面在应用程序中获取一个人的所有信息,我们首先将使用 ROW_NUMBER() 函数为每一行分配一个顺序号。其次,按请求的页面对行进行排序。

以下语句更清楚地解释了它

它将提供以下输出

SQL Server Row Number

如果我们不想使用子查询,我们可以使用通用表表达式 (CTE),如下面的语句所示

在此示例中,我们首先指定 CTE,它使用 ROW_NUMBER() 函数为结果集中的每一行按顺序分配。其次,外部查询返回所需的结果。执行后,我们将得到以下输出

SQL Server Row Number

结论

在本文中,我们学习了如何使用 SQL Server 中的 ROW NUMBER() 函数为查询的分区内的每条记录提供一个顺序号。