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

🔖 Справочник

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

🔖 Справочник занятия

Команды и функции ниже взяты из темы урока и оформлены как быстрый справочник.

WITH

Сохранить промежуточный набор строк.

WITH cte_name AS (...) SELECT ... FROM cte_name

Используется во втором задании для уникальных пар заказа и даты.

LAG

Получить предыдущую дату получения продукта.

LAG(date_received) OVER (PARTITION BY product_id ORDER BY date_received)

Без сортировки предыдущая дата не определена.

LEAD

Получить следующую дату получения продукта.

LEAD(date_received) OVER (PARTITION BY product_id ORDER BY date_received)

Удобно показать соседние даты в одной строке.

FIRST_VALUE

Взять максимум или минимум через первое значение отсортированного окна.

FIRST_VALUE(quantity) OVER (PARTITION BY inventory_id ORDER BY quantity DESC)

Для минимума меняйте сортировку на ASC.

DENSE_RANK

Выбрать топ продуктов без пропусков в рангах.

DENSE_RANK() OVER (ORDER BY quantity DESC)

Если несколько строк делят одно количество, они получат один ранг.

ROW_NUMBER

Пронумеровать строки и выбрать конкретную позицию.

ROW_NUMBER() OVER (ORDER BY inventory_id DESC)

Для 13-й строки фильтруйте WHERE row_num = 13 во внешнем запросе.

Полный справочник курса: SQL Reference. Документация по MongoDB в этом уроке не используется.