在本教學中,將學習如何使用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()函數為查詢分區中的每一行分配一個順序整數。
上一篇:
SQL Server Window函數
下一篇:無
