在本教程中,将学习如何使用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()
函数为结果集中的每一行分配一个连续的整数。 - 其次,外部查询返回第二页的行,其行号在
11
到20
之间。
在本教程中,学习了如何使用SQL Server ROW_NUMBER()
函数为查询分区中的每一行分配一个顺序整数。