У пользователя бывают несколько событий с одинаковым event_time (например, батч-логирование). Вы используете LAG(event_type) OVER (PARTITION BY user_id ORDER BY event_time) чтобы получить предыдущее событие. Как сделать результат стабильным при совпадениях по времени?

AДобавить PARTITION BY event_time
BУбрать ORDER BY event_time, тогда «предыдущее» будет определено
CЗаменить LAG на RANK и брать строки, где rank = 2
DДобавить в ORDER BY второй ключ-тай-брейкер (например event_id) вместе с event_time, чтобы порядок был детерминированным
Правильный ответ. Если ORDER BY не уникален, добавьте тай-брейкер (уникальный ключ) в сортировку окна.

Разбор

LAG определяет «предыдущую строку» только через порядок ORDER BY внутри OVER. Если event_time не уникален, порядок строк с одинаковым временем может быть произвольным, и тогда «предыдущее событие» будет нестабильным. Решение — сделать сортировку детерминированной: добавить уникальный ключ события как тай-брейкер, например ORDER BY event_time, event_id.

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

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