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