ROW_NUMBER (Transact-SQL)

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

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

語法

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;