Перейти к основному содержимому
Модуль 13 · Урок 3 из 451/57 в курсе~15 min
Уроки модуля (3/4)

Рейтинги: ROW_NUMBER, RANK и DENSE_RANK.

Рейтинги: ROW_NUMBER, RANK и DENSE_RANK.

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

Чтобы заставить их работать по критерию, мы должны использовать предложение ORDER BY внутри OVER().

Рейтинговое трио

  1. ROW_NUMBER(): присваивает каждой строке простой последовательный номер (1, 2, 3...), произвольно разрывая связи.
  2. RANK(): Создает эффект «Олимпийских игр»: 1, 2, 2, 4. Оставляет пробел («3» пропускается) и присваивает одинаковый ранг в случае ничьей.
  3. DENSE_RANK(): уплотняет ранги: 1, 2, 2, 3. После ничьей никогда не бывает пробелов.
SQL
SELECT
  product_name,
  price,
  RANK() OVER(ORDER BY price DESC) AS price_rank
FROM products;

Объединив PARTITION BY и ORDER BY внутри OVER(), мы можем получить «3 лучших в каждой категории»!

Упражнение#sql.m13.l3.e1
Попыток: 0Загрузка…

Извлеките «first_name», «last_name» и «id» из таблицы клиентов («customers») (предположим, что «id» — это идентификационный номер). Добавьте столбец «ранг» с помощью DENSE_RANK() на основе убывания идентификатора (от самого высокого к самому низкому).

Загрузка редактора…
Показать подсказку

DENSE_RANK() OVER(ORDER BY id DESC).

Решение доступно после 3 попыток

Упражнение#sql.m13.l3.e2
Попыток: 0Загрузка…

Создайте рейтинг для каждого «category_id» на основе цены продуктов («продукты»). Извлеките «category_id», «id», «price» и добавьте «price_rank» с помощью ROW_NUMBER() в порядке убывания «цены», разделив по «category_id».

Загрузка редактора…
Показать подсказку

Объедините PARTITION BY Category_id ORDER BY цена DESC внутри OVER.

Решение доступно после 3 попыток