SQL Server Row_number()函数

在本教程中,将学习如何使用SQL Server ROW_NUMBER()函数为结果集的每一行分配一个连续整数。

SQL Server ROW_NUMBER()函数简介

ROW_NUMBER()是一个Window函数,它为结果集的分区中的每一行分配一个连续的整数。 行号以每个分区中第一行的行号开头。

以下是ROW_NUMBER()函数的语法:

ROW_NUMBER() OVER (
    [PARTITION BY partition_expression, ... ]
    ORDER BY sort_expression [ASC | DESC], ...
)

在上面语法中,

  • PARTITION BY子句将结果集划分为分区。 ROW_NUMBER()函数分别应用于每个分区,并重新初始化每个分区的行号。PARTITION BY子句是可选的。如果未指定,ROW_NUMBER()函数会将整个结果集视为单个分区。
  • ORDER BY子句定义结果集的每个分区中的行的逻辑顺序。 ORDER BY子句是必需的,因为ROW_NUMBER()函数对顺序敏感。

SQL Server ROW_NUMBER()示例

下面将使用示例数据库中的sales.customers表来演示ROW_NUMBER()函数。

客户表结构

1. 在结果集中使用SQL Server ROW_NUMBER()函数示例
以下语句使用ROW_NUMBER()为每个客户行分配一个序号:

SELECT 
   ROW_NUMBER() OVER (
 ORDER BY first_name
   ) row_num,
   first_name, 
   last_name, 
   city
FROM 
   sales.customers;

执行上面查询语句,得到以下结果:

查询结果

在此示例中,未指定PARTITION BY子句,因此,ROW_NUMBER()将整个结果集视为单个分区。

2. 在分区上使用SQL Server ROW_NUMBER()示例
以下示例使用ROW_NUMBER()函数为每个客户分配一个顺序整数。 当城市发生变化时,它会重置数字:

SELECT 
   first_name, 
   last_name, 
   city,
   ROW_NUMBER() OVER (
      PARTITION BY city
      ORDER BY first_name
   ) row_num
FROM 
   sales.customers
ORDER BY 
   city;

执行上面查询语句,得到以下结果:

查询结果

在此示例中,使用PARTITION BY子句将客户按城市划分为分区。 当城市发生变化时,行号重新初始化。

3. 使用ROW_NUMBER()进行分页

ROW_NUMBER()函数对于应用程序中的分页很有用。 例如,可以按分页显示客户列表,每个页面有10行。

以下示例使用ROW_NUMBER()将客户从第11行返回到第20行作第二页显示的结果:

WITH cte_customers AS (
    SELECT 
        ROW_NUMBER() OVER(
             ORDER BY 
                first_name, 
                last_name
        ) row_num, 
        customer_id, 
        first_name, 
        last_name
     FROM 
        sales.customers
) SELECT 
    customer_id, 
    first_name, 
    last_name
FROM 
    cte_customers
WHERE 
    row_num > 20 AND 
    row_num <= 30;

执行上面查询语句,得到以下结果:
查询结果

在这个例子中:

  • 首先,CTE使用ROW_NUMBER()函数为结果集中的每一行分配一个连续的整数。
  • 其次,外部查询返回第二页的行,其行号在1120之间。

在本教程中,学习了如何使用SQL Server ROW_NUMBER()函数为查询分区中的每一行分配一个顺序整数。


上一篇: SQL Server Window函数 下一篇:无