Уроки модуля (3/4)
Рейтинги: ROW_NUMBER, RANK и DENSE_RANK.
Рейтинги: ROW_NUMBER, RANK и DENSE_RANK.
Помимо агрегирования, оконные функции прекрасно справляются с упорядочиванием и ранжированием. Существуют функции, разработанные специально для работы внутри окон (OVER() становится обязательным), которые назначают последовательные номера или ранжирующие позиции.
Чтобы заставить их работать по критерию, мы должны использовать предложение ORDER BY внутри OVER().
Рейтинговое трио
ROW_NUMBER(): присваивает каждой строке простой последовательный номер (1, 2, 3...), произвольно разрывая связи.RANK(): Создает эффект «Олимпийских игр»: 1, 2, 2, 4. Оставляет пробел («3» пропускается) и присваивает одинаковый ранг в случае ничьей.DENSE_RANK(): уплотняет ранги: 1, 2, 2, 3. После ничьей никогда не бывает пробелов.
SELECT
product_name,
price,
RANK() OVER(ORDER BY price DESC) AS price_rank
FROM products;Объединив PARTITION BY и ORDER BY внутри OVER(), мы можем получить «3 лучших в каждой категории»!
Извлеките «first_name», «last_name» и «id» из таблицы клиентов («customers») (предположим, что «id» — это идентификационный номер). Добавьте столбец «ранг» с помощью DENSE_RANK() на основе убывания идентификатора (от самого высокого к самому низкому).
Показать подсказку
DENSE_RANK() OVER(ORDER BY id DESC).
Решение доступно после 3 попыток
Создайте рейтинг для каждого «category_id» на основе цены продуктов («продукты»). Извлеките «category_id», «id», «price» и добавьте «price_rank» с помощью ROW_NUMBER() в порядке убывания «цены», разделив по «category_id».
Показать подсказку
Объедините PARTITION BY Category_id ORDER BY цена DESC внутри OVER.
Решение доступно после 3 попыток