🔥 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.

Главная мысль: мы не агрегируем пользователя один раз, а проверяем всю его временную историю через скользящее окно.

Такой подход часто используют для поиска: • подозрительной активности • всплесков платежей • превышения лимитов • аномалий в транзакциях 📊

🔥 Live Coding: сумма > 100000 за любой 7-дневный период
Задача:
Есть таблица transactions:
• userid
• transactiontime
• amount
Нужно найти пользователей, у которых сумма транзакций за любой 7-дневный ... | Сетка — социальная сеть от hh.ru