🔥 Live Coding: найти пользователей с заказами 3 дня подряд
Задача: Нужно найти user_id пользователей, которые делали заказ 3 дня подряд.
Таблица orders: • user_id • order_id • order_time
Решение:
with ww1 as ( select user_id, toDate(order_time) as order_day, lead(toDate(order_time), 1) over ( partition by user_id order by toDate(order_time), order_id ) as next_day_1, lead(toDate(order_time), 2) over ( partition by user_id order by toDate(order_time), order_id ) as next_day_2 from orders )
select distinct user_id from ww1 where next_day_1 = order_day + 1 and next_day_2 = order_day + 2
🧠 Как здесь думаем:
Сначала приводим время заказа к дате, чтобы работать именно по дням.
Дальше с помощью lead смотрим: • какой день идет следующим • какой день идет через один
Если для строки: • next_day_1 = текущий день + 1 • next_day_2 = текущий день + 2
значит пользователь делал заказы 3 дня подряд ✅
⚠️ Где можно ошибиться:
Если у пользователя в один день несколько заказов, могут появиться лишние строки. Поэтому в финале лучше взять distinct user_id.
🎯 Вывод:
Это удобный способ искать последовательности событий без self join. Запрос получается компактным и читаемым.