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

🏠 Домашнее задание

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

  1. Повторить запрос с предыдущим и последующим inventory_id по убыванию quantity.
  2. Повторить максимум и минимум unit_price через FIRST_VALUE.
  3. Повторить разницу с минимальной ценой через FIRST_VALUE и MIN.
  4. Повторить ранжирование по 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 по возрастанию, оба способа дают один и тот же минимум.