Функция SQL Server DENSE_RANK

В этом руководстве вы узнаете, как использовать функцию SQL Server DENSE_RANK() для назначения ранга каждой строке в разделе результирующего набора без пробелов в значениях ранга.

Введение в функцию SQL Server DENSE_RANK()

DENSE_RANK() — это оконная функция, которая присваивает ранг каждой строке в разделе набора результатов. В отличие от функции RANK(), функция DENSE_RANK() возвращает последовательные значения ранга. Строки в каждом разделе получают одинаковые ранги, если они имеют одинаковые значения.

Синтаксис функции DENSE_RANK() следующий:

DENSE_RANK() OVER(
    [PARTITION BY partition_expression, ... ]
    ORDER BY sort_expression [ASC | DESC], ...
)

Функция DENSE_RANK() применяется к строкам каждого раздела, определенного предложением PARTITION BY, в указанном порядке, определенном предложением ORDER BY. Она сбрасывает ранг при пересечении границы раздела.

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

Иллюстрация функции SQL Server DENSE_RANK()

Следующие операторы создают новую таблицу с именем dense_rank_demo и вставляют в нее несколько строк:

CREATE TABLE sales.dense_rank_demo(
 v VARCHAR(10)
);
INSERT INTO sales.dense_rank_demo(v)
VALUES('A'),('B'),('B'),('C'),('C'),('D'),('E');
SELECT * FROM sales.dense_rank_demo;

Следующий оператор использует обе функции DENSE_RANK() и RANK() для присвоения ранга каждой строке результирующего набора:

SELECT
 v,
 DENSE_RANK() OVER(
 ORDER BY v
 ) my_dense_rank,
 RANK() OVER(
 ORDER BY v
 ) my_rank
FROM
 sales.dense_rank_demo;

Вот что получилось:

Иллюстрация функции SQL Server DENSE_RANK

Примеры функции SQL Server DENSE_RANK()

Мы будем использовать таблицу production.products для демонстрации функции DENSE_RANK():

продукты

Пример использования SQL Server DENSE_RANK() для набора результатов

В следующем примере функция DENSE_RANK() используется для ранжирования продуктов по прейскурантным ценам:

SELECT
 product_id,
 product_name,
 list_price,
 DENSE_RANK() OVER( 
 ORDER BY list_price DESC
 ) price_rank 
FROM
 production.products;

Вот что получилось:

Пример функции SQL Server DENSE_RANK для результирующего набора

Пример использования SQL Server DENSE_RANK() для разделов

Следующий оператор ранжирует продукты в каждой категории по ценам в списке. Он возвращает только 3 лучших продукта в каждой категории по ценам в списке.

SELECT * FROM(
 SELECT
 product_id,
 product_name,
 category_id,
 list_price,
 DENSE_RANK() OVER( 
 PARTITION BY category_id
 ORDER BY list_price DESC
 ) price_rank 
 FROM
 production.products
) t
WHERE price_rank < 3;

На следующем рисунке показан результат:

Пример функции SQL Server DENSE_RANK для раздела

В этом руководстве вы узнали, как использовать функцию SQL Server DENSE_RANK() для назначения ранга каждой строке в разделе результирующего набора без пробелов в значениях ранга.

Мирослав С.

Автор статей, ИБ-специалист