🔥 Live Coding: сумма > 100000 за любой 7-дневный период
Задача: Есть таблица transactions:
• user_id • transaction_time • amount
Нужно найти пользователей, у которых сумма транзакций за любой 7-дневный период больше 100000.
На выходе хотим получить:
• user_id
Решение:
with rolling as ( select user_id, transaction_time, sum(amount) over ( partition by user_id order by transaction_time range between interval 7 day preceding and current row ) as rolling_7d_sum from transactions )
select distinct user_id from rolling where rolling_7d_sum > 100000
🧠 Как здесь думаем:
Нам не нужно просто посчитать общую сумму по пользователю.
Нужно проверить: был ли у пользователя хотя бы один момент времени, в котором сумма транзакций за последние 7 дней превышала 100000.
Поэтому логика такая:
• для каждой транзакции считаем сумму за последние 7 дней • получаем rolling_7d_sum • дальше оставляем только тех пользователей, у кого хотя бы в одной строке эта сумма > 100000
То есть мы как будто “прокатываем” окно в 7 дней по истории пользователя и смотрим, где порог был пробит ✅
⚠️ Где можно ошибиться:
Посчитать просто sum(amount) group by user_id
Так мы получим общую сумму за всё время, а не за любой отдельный 7-дневный период ❌
Перепутать range и rows
rows — это количество строк range — это диапазон по времени
Здесь нам нужен именно временной интервал, поэтому используем range.
Забыть partition by user_id
Тогда окно начнет считать сумму сразу по всем пользователям, и результат будет неверным.
Неправильно понять “любой 7-дневный период”
Это не обязательно календарная неделя. Это любое плавающее окно длиной 7 дней относительно каждой транзакции.
💡 Если нужно строго “последние 7 суток” без захвата лишней границы, это уже зависит от СУБД и трактовки interval. Но сама идея решения остается той же: оконная сумма по времени.
🎯 Вывод:
Это классическая задача на sliding window.
Главная мысль: мы не агрегируем пользователя один раз, а проверяем всю его временную историю через скользящее окно.
Такой подход часто используют для поиска: • подозрительной активности • всплесков платежей • превышения лимитов • аномалий в транзакциях 📊