ROW_NUMBER (Transact-SQL)
傳回結果集資料分割內某資料列的序號,序號從 1 開始,每個資料分割第一個資料列的序號是 1。
語法
ROW_NUMBER ( ) OVER ( [ <partition_by_clause> ] <order_by_clause> )
引數
<partition_by_clause>
將 FROM 子句所產生的結果集分成套用 ROW_NUMBER 函數的資料分割。如需 PARTITION BY 語法,請參閱<OVER 子句 (Transact-SQL)>。<order_by_clause>
決定將 ROW_NUMBER 值指派給資料分割中之資料列的順序。如需詳細資訊,請參閱<ORDER BY 子句 (Transact-SQL)>。在排名函數中使用 <order_by_clause> 時,整數無法表示資料行。
傳回類型
bigint
備註
ORDER BY 子句決定了在指定資料分割內,將唯一 ROW_NUMBER 指派給資料列的順序。
範例
A. 傳回銷售人員的資料列編號
下列範例根據年初至今的銷售來傳回 AdventureWorks 中銷售人員的 ROW_NUMBER。
SELECT FirstName, LastName, ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number', SalesYTD, PostalCode
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;
B. 傳回資料列的子集
下面範例會依照 OrderDate 的順序,傳回號碼是 50 至 60 的資料列,頭尾包括在內。
USE AdventureWorks;
GO
WITH OrderedOrders AS
(
SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
FROM Sales.SalesOrderHeader
)
SELECT *
FROM OrderedOrders
WHERE RowNumber BETWEEN 50 AND 60;
C. 搭配 PARTITION 使用 ROW_NUMBER()
下列範例顯示如何搭配 PARTITION BY 引數使用 ROW_NUMBER 函數。
SELECT FirstName, LastName, ROW_NUMBER() OVER(PARTITION BY PostalCode ORDER BY SalesYTD DESC) AS 'Row Number', SalesYTD, PostalCode
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;