Вы пишете LAG(price) OVER (PARTITION BY product_id), чтобы получить «вчерашнюю цену» товара по дням. Почему результат может оказаться неожиданным?
AБез
ORDER BY понятие «предыдущая строка» в окне не определено, и значение LAG может быть из любой датыB
LAG без 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), чтобы получить «вчерашнюю цену» товара по дням. Почему результат может оказаться неожиданным?Ещё вопросы по теме «Оконные функции»
- В одной категории 4 товара с выручкой 100, 100, 90 и 80. Вычисляем `RANK() OVER (ORDER BY revenue DESC)`. Какие ранги получат строки при сортировке по убыванию выручки?
- Вы ищете последнюю транзакцию пользователя, используя `ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY paid_at DESC)` и оставляя `row_number = 1`. Что верно, если у пользователя две транзакции с одинаковым `paid_at`?
- Вы делаете рейтинг товаров по выручке внутри категории. Если два товара делят 2 место, следующий товар должен получить 3 место (без пропуска). Какая функция подходит лучше всего?
- В каждой категории нужно выбрать товары с тремя наибольшими различными значениями выручки (`revenue`), включая все товары, которые делят эти значения при равенстве. Какой вариант даст нужный результат?
- Нужно пронумеровать заказы каждого пользователя по времени покупки, начиная с 1, чтобы найти его 1-й, 2-й, 3-й заказ. Какое выражение подходит?
- Все вопросы по «Оконные функции» →