📁 Блок: 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.
🏠 Домашнее задание
В summary session источник разбирает домашнее задание 10 из занятия 38 по таблице purchase_order_details.
Повторить запрос с предыдущим и последующим inventory_id по убыванию quantity.
Повторить максимум и минимум unit_price через FIRST_VALUE.
Повторить разницу с минимальной ценой через FIRST_VALUE и MIN.
Повторить ранжирование по quantity и фильтр ранга до 10.
Пошаговое решение и проверка
Разбор ранга до 10
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;
Это ключевой паттерн домашки: сначала ранг, затем внешний фильтр.
Разбор минимума двумя способами
SELECT
order_id,
unit_price,
unit_price - FIRST_VALUE(unit_price) OVER (
PARTITION BY order_id
ORDER BY unit_price ASC
) AS diff_by_first_value,
unit_price - MIN(unit_price) OVER (
PARTITION BY order_id
) AS diff_by_min
FROM purchase_order_details;
Если сортировка у FIRST_VALUE по возрастанию, оба способа дают один и тот же минимум.