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

🐛 Ошибки

📁 Блок: SQL / MySQL / Оконные функции ⏱️ Время изучения: ~90 мин 🎯 Сложность: Продвинутая

⚡ Кратко: ошибки

Функции смещения и выбора позволяют смотреть не только на текущую строку, но и на соседние или крайние строки внутри окна.

LAG() возвращает значение из предыдущей строки, а LEAD() — из следующей строки в порядке, заданном внутри OVER.

FIRST_VALUE(), LAST_VALUE() и NTH_VALUE() выбирают первое, последнее или n-е значение в окне.

Ключевая конструкция урока: function(column) OVER (PARTITION BY group_column ORDER BY sort_column).

Минимальный пример: LAG(creation_date) OVER (PARTITION BY supplier_id ORDER BY creation_date) показывает предыдущую дату заказа поставщика.

Топ-3 ошибки: забыть ORDER BY, перепутать направление LEAD/LAG, использовать LAST_VALUE без явной рамки окна.

🐛 Типичные ошибки

Ошибка 1. Нет ORDER BY внутри окна

Симптом: Функция возвращает «предыдущую» строку, но порядок не определён.

Исправление: Всегда задавайте ORDER BY по дате, цене или другому смысловому столбцу.

Ошибка 2. PARTITION BY забыли для supplier_id

Симптом: Предыдущий заказ может оказаться заказом другого поставщика.

Исправление: Разделяйте окно по сущности, внутри которой сравниваются строки.

Ошибка 3. LAST_VALUE возвращает текущую строку

Симптом: Ожидали последнюю цену месяца, а получили цену текущей строки.

Исправление: Добавьте явную рамку ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.

Ошибка 4. Фильтрация оконной функции в WHERE

Симптом: Запрос падает или не видит псевдоним оконной функции.

Исправление: Сначала посчитайте окно в CTE или подзапросе, затем фильтруйте внешний запрос.