Функция DENSE_RANK() позволяет нам присвоить уникальный ранг каждой строке в наборе результатов на основе значений в еще одном указанном столбце. Она очень похожа на функцию Rank(), но с небольшими отличиями в том, как функция обрабатывает повторяющиеся записи.
В этом уроке мы рассмотрим, как работает эта функция, ее синтаксис и как мы можем использовать ее в базе данных.
Как это работает
Начнем с объяснения того, как работает эта функция. Следует помнить, что функция является высокоуровневой, и мы не можем объяснить ее реализацию.
Функция работает, присваивая ранг каждой строке в наборе результатов, начиная с ранга 1 и увеличивая его на 1 для каждого уникального значения в столбцах.
Строкам с похожими значениями (дубликатам) в указанных столбцах присваивается одинаковый ранг, а следующей строке с другим значением присваивается следующий доступный ранг без каких-либо пробелов.
Как мы уже упоминали, функция не оставляет пробелов в случае повторяющихся значений, что отличает ее от функции Rank().
Функция Densent_rank() обычно используется для выполнения операций ранжирования. Например, мы можем использовать его для поиска N верхних записей и т. д.
Синтаксис функции:
Ниже описан синтаксис функции Density_rank():
DENSE_RANK() НАД ([РАЗДЕЛ ПО выражению_раздела, ... ]
ЗАКАЗ ПО выражению_сортировки [ASC | ДЕСК], ...
)
В данном синтаксисе:
- Начнем с самой функции Densent_rank().
- Предложение OVER сигнализирует о начале спецификации оконной функции. Это определяет, как ранжирование применяется в наборе результатов.
- PARTITION BY выражение_раздела — это необязательное предложение, которое позволяет нам разделить результирующий набор на группы или разделы на основе одного или нескольких столбцов. Рейтинг применяется отдельно к каждому разделу с сбросом ранга в новом разделе.
- Выражение sort_expression ORDER BY определяет порядок, в котором мы хотим сортировать данные в результирующих разделах.
Образец данных
Чтобы продемонстрировать, как использовать функцию Densent_rank(), давайте начнем с таблицы с примером данных. В нашем случае мы используем примерную таблицу «заказов» следующим образом:
Пример 1: Использование функции Dense_Rank()
Мы можем использовать функцию Densent_rank() для ранжирования полученных ордеров на основе цены. Рассмотрим следующий пример запроса:
ВЫБИРАТЬномер заказа,
имя_пользователя_клиента,
продукт_куплен,
DENSE_RANK() НАД (
ЗАКАЗ К
цена ДИСК
) цена_ранг
ОТ
заказы о;
В данном примере мы используем функцию Densent_rank() для ранжирования данных на основе цены ордеров. Мы опускаем предложение PARTITION BY, поскольку мы не группируем данные.
Полученный результат выглядит следующим образом:
Пример 2: РАЗДЕЛЕНИЕ ПО
Мы также можем добавить предложение PARTITION BY, чтобы сгруппировать данные по различным сегментам, например, на основе приобретенного продукта.
Пример запроса выглядит следующим образом:
ВЫБИРАТЬномер заказа,
имя_пользователя_клиента,
продукт_куплен,
DENSE_RANK() НАД (
раздел по product_purchased
ЗАКАЗ К
цена ДИСК
) цена_ранг
ОТ
заказы о;
Это должно сгруппировать данные в различные группы на основе полученных групп и применить ранг к элементам в каждой группе.
Заключение
В этом посте мы изучили основы использования и работы с оконной функцией Densent_rank() в SQL для присвоения ранга значениям на основе определенных столбцов.