Ошибка 1. Нет ORDER BY внутри окна
Симптом: Функция возвращает «предыдущую» строку, но порядок не определён.
Исправление: Всегда задавайте ORDER BY по дате, цене или другому смысловому столбцу.
Функции смещения и выбора позволяют смотреть не только на текущую строку, но и на соседние или крайние строки внутри окна.
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 без явной рамки окна.
Симптом: Функция возвращает «предыдущую» строку, но порядок не определён.
Исправление: Всегда задавайте ORDER BY по дате, цене или другому смысловому столбцу.
Симптом: Предыдущий заказ может оказаться заказом другого поставщика.
Исправление: Разделяйте окно по сущности, внутри которой сравниваются строки.
Симптом: Ожидали последнюю цену месяца, а получили цену текущей строки.
Исправление: Добавьте явную рамку ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.
Симптом: Запрос падает или не видит псевдоним оконной функции.
Исправление: Сначала посчитайте окно в CTE или подзапросе, затем фильтруйте внешний запрос.