Перейти до основного вмісту
Модуль 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' є номером ідентифікатора). Додайте стовпець "rank" за допомогою DENSE_RANK() на основі "id" за спаданням (від найвищого до найнижчого).

Завантаження редактора…
Показати підказку

DENSE_RANK() OVER(ORDER BY id DESC).

Рішення доступне після 3 спроб

вправи#sql.m13.l3.e2
Спроби: 0Завантаження…

Створіть рейтинг для кожного 'category_id' на основі ціни продуктів ('products'). Видобудьте 'category_id', 'id', 'price' і додайте 'price_rank' за допомогою ROW_NUMBER() у порядку спадання 'price', розділяючи за 'category_id'.

Завантаження редактора…
Показати підказку

Об’єднайте PARTITION BY category_id ORDER BY price DESC всередині OVER.

Рішення доступне після 3 спроб