Вы пишете 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.

Можно заниматься бесплатно

Готовим вопросы…

Три вопроса по теме этой страницы, с объяснениями.

Продолжить в браузере

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