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 в пределах указанной секции.

Примеры

ms186734.note(ru-ru,SQL.90).gifПримечание.
Предложение 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 г.

Новое содержимое.
  • Добавлен пример для аргумента PARTITION BY.

См. также

Справочник

RANK (Transact-SQL)
DENSE_RANK (Transact-SQL)
NTILE (Transact-SQL)
Ранжирующие функции (Transact-SQL)
Функции (Transact-SQL)

Справка и поддержка

Получение помощи по SQL Server 2005