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

ALAG всегда возвращает NULL, если в окне нет ORDER BY
BБез ORDER BY понятие «предыдущая строка» в окне не определено, поэтому «предыдущее» значение может быть произвольным
CНужно заменить LAG на RANK, потому что LAG не работает по товарам
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) (и при совпадениях добавьте тай-брейкер).

Проверь себя · 1/3разбор после ответа
Вы делаете рейтинг товаров по выручке внутри категории. Если два товара делят 2 место, следующий товар должен получить 3 место (без пропуска). Какая функция подходит лучше всего?
Тренировать SQL в Telegram

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