ROW_NUMBER (Transact-SQL)
Изменения: 17 июля 2006 г.
Возвращает последовательный номер строки в секции результирующего набора, 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 в пределах указанной секции.
Примеры
Примечание. |
---|
Предложение ORDER BY в предложении OVER упорядочивает ROW_NUMBER . При добавлении в инструкцию SELECT предложения ORDER BY , упорядочивающего результирующий набор по столбцам, отличным от 'Row Number' , результирующий набор будет упорядочен по внешнему предложению ORDER BY . |
В следующем примере с помощью функции ROW_NUMBER
возвращаются номера менеджеров по продажам из базы данных AdventureWorks
на основе данных продаж за текущий год.
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;
В следующем примере возвращаются строки с номерами от 50
до 60
включительно, в порядке возрастания значения OrderDate
.
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;
Журнал изменений
Версия | Журнал |
---|---|
17 июля 2006 г. |
|
См. также
Справочник
RANK (Transact-SQL)
DENSE_RANK (Transact-SQL)
NTILE (Transact-SQL)
Ранжирующие функции (Transact-SQL)
Функции (Transact-SQL)