本文件已封存並已停止維護。

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 的順序,傳回號碼是 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;

下列範例會顯示如何使用 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 引數的範例。
顯示: