ROW_NUMBER (Transact-SQL)

更新: 2006 年 7 月 17 日

傳回結果集資料分割內某資料列的序號,序號從 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 指派給資料列的順序。

範例

ms186734.note(zh-tw,SQL.90).gif附註:
OVER 子句中的 ORDER BY 會排序 ROW_NUMBER。如果您將 ORDER BY 子句加入到由資料行而非 'Row Number' the 進行排序的 SELECT 陳述式中,結果集就會由外部的 ORDER BY 進行排序。

下列範例根據年初至今的銷售來傳回 AdventureWorks 中銷售人員的 ROW_NUMBER

USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName
    ,ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number'
    ,s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson s 
    INNER JOIN Person.Contact c 
        ON s.SalesPersonID = c.ContactID
    INNER JOIN Person.Address a 
        ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL 
    AND SalesYTD <> 0;

下面範例會依照 OrderDate 的順序,傳回號碼是 5060 的資料列,頭尾包括在內。

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;

下列範例會顯示如何使用 PARTITION BY 引數。

USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName
    ,ROW_NUMBER() OVER 
    (PARTITION BY PostalCode ORDER BY SalesYTD DESC) AS 'Row Number'
    ,s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson s 
    INNER JOIN Person.Contact c 
        ON s.SalesPersonID = c.ContactID
    INNER JOIN Person.Address a 
        ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL 
    AND SalesYTD <> 0;

變更歷程記錄

版本 歷程記錄

2006 年 7 月 17 日

新增內容:
  • 新增 PARTITION BY 引數的範例。

請參閱

參考

RANK (Transact-SQL)
DENSE_RANK (Transact-SQL)
NTILE (Transact-SQL)
次序函數 (Transact-SQL)
函數 (Transact-SQL)

說明及資訊

取得 SQL Server 2005 協助