ROW_NUMBER (Transact-SQL)
更新: 2006 年 7 月 17 日
傳回結果集資料分割內某資料列的序號,序號從 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 指派給資料列的順序。
範例
附註: |
---|
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 日 |
|
請參閱
參考
RANK (Transact-SQL)
DENSE_RANK (Transact-SQL)
NTILE (Transact-SQL)
次序函數 (Transact-SQL)
函數 (Transact-SQL)