У пользователя бывают несколько событий с одинаковым event_time (например, батч-логирование). Вы используете LAG(event_type) OVER (PARTITION BY user_id ORDER BY event_time) чтобы получить предыдущее событие. Как сделать результат стабильным при совпадениях по времени?
AДобавить
PARTITION BY event_time в окно, чтобы строки с одинаковым временем оказались в разных секцияхBДобавить тай-брейкер
event_id в ORDER BY event_time, event_id, и порядок станет детерминированнымCЗаменить
LAG на оконную RANK и брать строки с rank = 2 для устойчивой обработки совпаденийDУбрать
ORDER BY event_time из окна, тогда порядок определится естественным порядком вставки строкПравильный ответ. Если
ORDER BY не уникален, добавьте тай-брейкер (уникальный ключ строки) в сортировку оконной функции.Разбор
LAG определяет «предыдущую строку» только через порядок ORDER BY внутри OVER. Если event_time не уникален, порядок строк с одинаковым временем может быть произвольным, и тогда «предыдущее событие» будет нестабильным. Решение — сделать сортировку детерминированной: добавить уникальный ключ события как тай-брейкер, например ORDER BY event_time, event_id.
Проверь себя · 1/3разбор после ответа
Вы хотите получить одну строку на пользователя с итоговой выручкой и заменили
GROUP BY на оконную SUM(amount) OVER (PARTITION BY user_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-й заказ. Какое выражение подходит?
- Все вопросы по «Оконные функции» →