Вы хотите получить «предыдущую цену» товара по дням и пишете LAG(price) OVER (PARTITION BY product_id). Почему результат может быть неожиданным?
A
LAG всегда возвращает NULL, если в окне нет ORDER BYBБез
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 место (без пропуска). Какая функция подходит лучше всего?
Ещё вопросы по теме «Оконные функции»
- В одной категории 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-й заказ. Какое выражение подходит?
- Все вопросы по «Оконные функции» →