ROW_NUMBER (Transact-SQL)
Возвращает последовательный номер строки в секции результирующего набора, 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 в пределах указанной секции.
Примеры
А. Возврат номера строки для salespeople
В следующем примере с помощью функции ROW_NUMBER возвращаются номера менеджеров по продажам из базы данных AdventureWorks на основе данных продаж за текущий год.
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;
Б. Получение подмножества строк
В следующем примере возвращаются строки с номерами от 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;
В. Использование функции ROW_NUMBER() с аргументом PARTITION
Следующий пример демонстрирует использование функции ROW_NUMBER с аргументом PARTITION BY.
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;