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


RANK (Transact-SQL)

Возвращает ранг каждой строки в секции результирующего набора. Ранг строки вычисляется как единица плюс количество рангов, находящихся до этой строки.

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

RANK ( )    OVER ( [ < partition_by_clause > ] < order_by_clause > )

Аргументы

  • < partition_by_clause >
    Делит результирующий набор, полученный с помощью предложения FROM, на секции, к которым применяется функция RANK. Синтаксис предложения PARTITION BY см. в разделе Предложение OVER (Transact-SQL).

  • < order_by_clause >
    Определяет порядок, в котором значения RANK применяются к строкам в секции. Дополнительные сведения см. в разделе Предложение ORDER BY (Transact-SQL). Целое значение не может представлять столбец < order_by_clause > при использовании его в ранжирующей функции.

Типы возвращаемых данных

bigint

Замечания

Если две и более строки претендуют на один ранг, то все они получат одинаковый ранг. Например, если двум лучшим продавцам соответствует одинаковое значение SalesYTD, им обоим присваивается ранг 1. Менеджер по продажам со следующим по величине значением SalesYTD получит ранг номер три, так как перед ним находятся две строки с более высоким рангом. Поэтому функция RANK не всегда возвращает последовательные целые числа.

Порядок сортировки, используемый для всего запроса, определяет порядок, в котором строки будут появляться в результирующем наборе.

Примеры

Следующий пример ранжирует продукты в остатке по их количеству. Набор строк секционируется по столбцу LocationID и сортируется по столбцу Quantity. Обратите внимание, что ключевое слово ORDER BY в предложении OVER упорядочивает RANK, а в инструкции SELECT — результирующий набор.

USE AdventureWorks;
GO
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity
    ,RANK() OVER 
    (PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS 'RANK'
FROM Production.ProductInventory i 
    INNER JOIN Production.Product p 
        ON i.ProductID = p.ProductID
ORDER BY p.Name;
GO