Data Analyst Professional · Модуль 5 · Урок 17 із 51
Ранжування, частки й накопичувальні підсумки
ROW_NUMBER, RANK і DENSE_RANK по-різному поводяться з ties. У тому самому window toolkit можна без self-join порахувати частку від total і накопичувальний підсумок.
Оберіть семантику рангу
| Функція | 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_numberTop-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.
Закріпіть матеріал уроку
Три сценарні питання. Для зарахування уроку потрібно дати щонайменше дві правильні відповіді.