共用方式為


ROW_NUMBER (Transact-SQL)

傳回結果集資料分割內某資料列的序號,序號從 1 開始,每個資料分割第一個資料列的序號是 1。

主題連結圖示 Transact-SQL 語法慣例

語法

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() 之查詢所傳回的資料列一定會在每次執行時依照相同的方式排列。

  1. 資料分割資料行的值是唯一的。

  2. ORDER BY 資料行的值是唯一的。

  3. 資料分割資料行和 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

請參閱

參考

RANK (Transact-SQL)

DENSE_RANK (Transact-SQL)

NTILE (Transact-SQL)