Модульні уроки (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' є номером ідентифікатора). Додайте стовпець "rank" за допомогою DENSE_RANK() на основі "id" за спаданням (від найвищого до найнижчого).
Показати підказку
DENSE_RANK() OVER(ORDER BY id DESC).
Рішення доступне після 3 спроб
Створіть рейтинг для кожного 'category_id' на основі ціни продуктів ('products'). Видобудьте 'category_id', 'id', 'price' і додайте 'price_rank' за допомогою ROW_NUMBER() у порядку спадання 'price', розділяючи за 'category_id'.
Показати підказку
Об’єднайте PARTITION BY category_id ORDER BY price DESC всередині OVER.
Рішення доступне після 3 спроб