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

💻 Примеры

📁 Блок: 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.

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

Сводный пример: рейтинг и соседняя дата

Один запрос может содержать несколько оконных функций.

SELECT
    product_id,
    date_received,
    quantity,
    LAG(date_received) OVER (
        PARTITION BY product_id
        ORDER BY date_received
    ) AS previous_date_received,
    DENSE_RANK() OVER (
        ORDER BY quantity DESC
    ) AS quantity_rank
FROM purchase_order_details
WHERE date_received IS NOT NULL;

Почему так: Первое окно работает внутри продукта, второе — по всей выборке. Это нормально: у каждой функции может быть своё окно.

Домашний паттерн: фильтр ранга

Фильтруем результат оконной функции во внешнем запросе.

WITH ranked_details AS (
    SELECT
        *,
        RANK() OVER (ORDER BY quantity DESC) AS quantity_rank
    FROM purchase_order_details
)
SELECT *
FROM ranked_details
WHERE quantity_rank <= 10;

Почему так: Так сохраняется корректный порядок вычисления SQL: сначала SELECT с окном, потом внешний WHERE.