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

💻 Примеры

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

⚡ Кратко: примеры

Практикум 10 закрепляет оконные функции ранжирования, смещения и выбора на таблице purchase_order_details.

Ключевые конструкции: LAG, LEAD, FIRST_VALUE, DENSE_RANK, ROW_NUMBER, CTE.

Минимальный пример: LAG(date_received) OVER (PARTITION BY product_id ORDER BY date_received) показывает предыдущую дату получения продукта.

Практический фокус — сначала получить аналитический столбец, а затем фильтровать результат через CTE или подзапрос.

Топ-3 ошибки: не задать сортировку для LAG/LEAD, фильтровать ROW_NUMBER в том же WHERE, забыть убрать строки с пустым date_received.

💻 Выполнимые примеры

Соседние даты продукта

Разогрев перед первым заданием.

SELECT
    product_id,
    date_received,
    LAG(date_received) OVER (
        PARTITION BY product_id
        ORDER BY date_received
    ) AS previous_date_received,
    LEAD(date_received) OVER (
        PARTITION BY product_id
        ORDER BY date_received
    ) AS next_date_received
FROM purchase_order_details
WHERE date_received IS NOT NULL;

Почему так: Фильтр по date_received стоит до оконной функции, поэтому окно строится только по строкам с указанной датой.

Топ продуктов по quantity

Пример для пятого задания.

WITH ranked_products AS (
    SELECT
        product_id,
        quantity,
        DENSE_RANK() OVER (
            ORDER BY quantity DESC
        ) AS quantity_rank
    FROM purchase_order_details
)
SELECT *
FROM ranked_products
WHERE quantity_rank <= 5;

Почему так: DENSE_RANK не пропускает ранги при одинаковом количестве, поэтому топ-5 может вернуть больше пяти строк.