Поделиться через


ROW_NUMBER (Transact-SQL)

Возвращает последовательный номер строки в секции результирующего набора, 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 в пределах указанной секции.

Примеры

А. Возврат номера строки для salespeople

В следующем примере с помощью функции ROW_NUMBER возвращаются номера менеджеров по продажам из базы данных AdventureWorks2008R2 на основе данных продаж за текущий год.

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 AdventureWorks2008R2;
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;