Data Analyst Professional · Модуль 5 · Урок 17 із 51

Ранжування, частки й накопичувальні підсумки

ROW_NUMBER, RANK і DENSE_RANK по-різному поводяться з ties. У тому самому window toolkit можна без self-join порахувати частку від total і накопичувальний підсумок.

90–120 хвRankingМінітест: 3 питання

Оберіть семантику рангу

ФункціяTiesНаступний номерЗастосування
ROW_NUMBERрізні номерибез пропусківодин детермінований row per group
RANKоднаковий rankіз пропускомспортивне місце
DENSE_RANKоднаковий rankбез пропускурівні distinct values
ROW_NUMBER() OVER ( PARTITION BY customer_id ORDER BY ordered_at DESC, order_id DESC ) AS recency_number

Top-N per group

WITH ranked AS ( SELECT o.*, ROW_NUMBER() OVER ( PARTITION BY customer_id ORDER BY net_amount DESC, order_id ) AS rn FROM seowork_lab.orders AS o WHERE status = 'completed' ) SELECT * FROM ranked WHERE rn <= 3;

Window result не можна фільтрувати в WHERE того самого SELECT, бо window functions обчислюються пізніше. Використовуйте CTE/subquery, а у СУБД із підтримкою — QUALIFY.

Частка від total і running total

SELECT order_id, ordered_at, net_amount, net_amount / NULLIF(SUM(net_amount) OVER (), 0) AS share_total, SUM(net_amount) OVER ( ORDER BY ordered_at, order_id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS running_revenue FROM seowork_lab.orders WHERE status = 'completed';

Для share numerator і denominator мають однаковий scope. Для running total останній row повинен reconciliation до загального total.

Практика і перевірки

  • Покажіть різницю трьох rank functions на ties.
  • Виберіть останнє замовлення customer з унікальним tie-breaker.
  • Порахуйте top-3 orders по кожному channel.
  • Перевірте, що сума shares дорівнює 1 з урахуванням rounding.
  • Звірте останній running total із незалежною SUM.

Офіційна довідка

Готовність до тесту

Ви обираєте rank за business semantics, будуєте top-N per group і доводите коректність частки та running total.

Практична перевірка · урок 17 з 51

Закріпіть матеріал уроку

Три сценарні питання. Для зарахування уроку потрібно дати щонайменше дві правильні відповіді.

1. Як ROW_NUMBER поводиться з ties?
2. Як RANK поводиться після tie?
3. Як DENSE_RANK поводиться після tie?