ROW_NUMBER (Transact-SQL)
傳回結果集資料分割內某資料列的序號,序號從 1 開始,每個資料分割第一個資料列的序號是 1。
語法
ROW_NUMBER ( )
OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )
引數
PARTITION BY value_expression
將 FROM 子句所產生的結果集分成套用 ROW_NUMBER 函數的資料分割。 value_expression 會指定用於分割結果集的資料行。 如未指定 PARTITION BY,此函數會將查詢結果集的所有資料列視為單一群組。 如需詳細資訊,請參閱<OVER 子句 (Transact-SQL)>。order_by_clause
ORDER BY 子句決定了在指定資料分割內,將唯一 ROW_NUMBER 指派給資料列的順序。 此為必要。 如需詳細資訊,請參閱<OVER 子句 (Transact-SQL)>。
傳回類型
bigint
一般備註
除非下列條件成立,否則不保證使用 ROW_NUMBER() 之查詢所傳回的資料列一定會在每次執行時依照相同的方式排列。
資料分割資料行的值是唯一的。
ORDER BY 資料行的值是唯一的。
資料分割資料行和 ORDER BY 資料行的值組合是唯一的。
範例
A.傳回銷售人員的資料列編號
下列範例根據年初至今的銷售業績排名計算 Adventure Works Cycles 中銷售人員的資料列編號。
USE AdventureWorks2012;
GO
SELECT ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS Row,
FirstName, LastName, ROUND(SalesYTD,2,1) AS "Sales YTD"
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;
以下為結果集:
Row FirstName LastName SalesYTD
--- ----------- ---------------------- -----------------
1 Linda Mitchell 4251368.54
2 Jae Pak 4116871.22
3 Michael Blythe 3763178.17
4 Jillian Carson 3189418.36
5 Ranjit Varkey Chudukatil 3121616.32
6 José Saraiva 2604540.71
7 Shu Ito 2458535.61
8 Tsvi Reiter 2315185.61
9 Rachel Valdez 1827066.71
10 Tete Mensa-Annan 1576562.19
11 David Campbell 1573012.93
12 Garrett Vargas 1453719.46
13 Lynn Tsoflias 1421810.92
14 Pamela Ansman-Wolfe 1352577.13
B.傳回資料列的子集
下列範例會計算 SalesOrderHeader 資料表中所有資料列的編號,並以 OrderDate 順序排列,然後只傳回包含 50 至 60 的資料列。
USE AdventureWorks2012;
GO
WITH OrderedOrders AS
(
SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (ORDER BY OrderDate) AS RowNumber
FROM Sales.SalesOrderHeader
)
SELECT SalesOrderID, OrderDate, RowNumber
FROM OrderedOrders
WHERE RowNumber BETWEEN 50 AND 60;
C.並用 PARTITION 與 ROW_NUMBER()
下列範例使用 PARTITION BY 引數依據資料行 TerritoryName 分割查詢結果集。 OVER 中指定的 ORDER BY 子句會依資料行 SalesYTD 排列每個資料分割的資料列。 SELECT 陳述式中的 ORDER BY 子句會依照 TerritoryName 排列整個查詢結果集。
USE AdventureWorks2012;
GO
SELECT FirstName, LastName, TerritoryName, ROUND(SalesYTD,2,1),
ROW_NUMBER() OVER(PARTITION BY TerritoryName ORDER BY SalesYTD DESC) AS Row
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0
ORDER BY TerritoryName;
以下為結果集:
FirstName LastName TerritoryName SalesYTD Row
--------- -------------------- ------------------ ------------ ---
Lynn Tsoflias Australia 1421810.92 1
José Saraiva Canada 2604540.71 1
Garrett Vargas Canada 1453719.46 2
Jillian Carson Central 3189418.36 1
Ranjit Varkey Chudukatil France 3121616.32 1
Rachel Valdez Germany 1827066.71 1
Michael Blythe Northeast 3763178.17 1
Tete Mensa-Annan Northwest 1576562.19 1
David Campbell Northwest 1573012.93 2
Pamela Ansman-Wolfe Northwest 1352577.13 3
Tsvi Reiter Southeast 2315185.61 1
Linda Mitchell Southwest 4251368.54 1
Shu Ito Southwest 2458535.61 2
Jae Pak United Kingdom 4116871.22 1