← К оглавлению занятия

✅ Решения

📁 Блок: SQL / MySQL / Оконные функции ⏱️ Время изучения: ~60 мин 🎯 Сложность: Повторение

⚡ Кратко: решения

Summary session 10 повторяет два блока оконных функций: ранжирование и смещение/выбор.

Для ранжирования используем ROW_NUMBER, RANK, DENSE_RANK, NTILE.

Для сравнения соседних строк используем LAG и LEAD; для крайних значений — FIRST_VALUE и LAST_VALUE.

Минимальный пример: DENSE_RANK() OVER (ORDER BY quantity DESC) строит рейтинг по количеству, а LAG(date_received) OVER (ORDER BY date_received) находит предыдущую дату.

Топ-3 ошибки: путать RANK и DENSE_RANK, забывать ORDER BY в окне, фильтровать результат окна до внешнего SELECT.

✅ Решения и разбор

Функция по формулировке

-- предыдущая дата
LAG(date_received) OVER (ORDER BY date_received)

-- топ-5 без пропусков ранга
DENSE_RANK() OVER (ORDER BY quantity DESC)

-- 13-я строка
ROW_NUMBER() OVER (ORDER BY inventory_id DESC)

-- минимальная цена заказа
FIRST_VALUE(unit_price) OVER (
    PARTITION BY order_id
    ORDER BY unit_price ASC
)

-- квартиль
NTILE(4) OVER (ORDER BY sale_amount)

Выбор функции зависит от позиции строки, которую нужно получить: соседняя, ранговая, первая или группа.

RANK и DENSE_RANK

SELECT
    product_id,
    quantity,
    RANK() OVER (ORDER BY quantity DESC) AS rank_with_gaps,
    DENSE_RANK() OVER (ORDER BY quantity DESC) AS dense_rank_without_gaps
FROM purchase_order_details;

Если два продукта имеют одинаковое quantity, RANK даст одинаковый ранг и пропустит следующий номер, а DENSE_RANK не пропустит.