Вы пишете LAG(price) OVER (PARTITION BY product_id), чтобы получить «вчерашнюю цену» товара по дням. Почему результат может оказаться неожиданным?

AБез ORDER BY понятие «предыдущая строка» в окне не определено, и значение LAG может быть из любой даты
BLAG без ORDER BY в окне возвращает NULL для всех строк секции, поэтому результат становится пустым
CВ одном запросе LAG следует сочетать только с OVER () без PARTITION BY, иначе функция неверно работает
DНужно добавить GROUP BY product_id к запросу, иначе LAG блокируется внутри секционированного окна
Правильный ответ. Для LAG обязателен осмысленный порядок через ORDER BY в окне.

Разбор

Окно OVER (PARTITION BY product_id) задаёт группу строк товара, но не задаёт их порядок. Без ORDER BY dt невозможно определить, какая строка «вчерашняя», поэтому LAG(price) может вернуть значение из любой даты внутри секции. Чтобы анализировать динамику, используйте LAG(price) OVER (PARTITION BY product_id ORDER BY dt) (и при совпадениях добавьте дополнительный ключ сортировки). LAG свободно сочетается с PARTITION BY, не возвращает NULL автоматически и не требует GROUP BY.

Проверь себя · 1/3разбор после ответа
Вы пишете LAG(price) OVER (PARTITION BY product_id), чтобы получить «вчерашнюю цену» товара по дням. Почему результат может оказаться неожиданным?
Тренировать SQL в Telegram

Ещё вопросы по теме «Оконные функции»