В card_tx — списания по картам. Для каждой операции посчитайте sum_30d: сумму всех операций того же клиента, у которых tx_at от tx_at - 30 дней до tx_at текущей операции, обе границы включены.
Операции в одну и ту же секунду входят в окна друг друга. Верните tx_id, client_id, tx_at, amount_rub, sum_30d. Порядок — по client_id, tx_at, tx_id.
В работе: Лимиты и антифрод: месячный лимит трат считают по скользящему окну, а не по календарному месяцу.
Таблицы
card_tx — списания по картам
| Колонка | Тип | Что значит |
|---|---|---|
tx_id | int | ключ |
client_id | int | клиент |
tx_at | timestamp | время |
amount_rub | numeric | сумма |
Пример: данные
card_tx · 5 строк
| tx_id | client_id | tx_at | amount_rub |
|---|---|---|---|
| 1 | 1 | 2026-01-01T10:00:00 | 1000 |
| 2 | 1 | 2026-01-15T10:00:00 | 2000 |
| 3 | 1 | 2026-01-31T10:00:00 | 500 |
| 4 | 1 | 2026-02-01T09:00:00 | 700 |
| 5 | 2 | 2026-01-20T13:30:00 | 3500 |
Ожидаемый ответ
| tx_id | client_id | tx_at | amount_rub | sum_30d |
|---|---|---|---|---|
| 1 | 1 | 2026-01-01T10:00:00 | 1000 | 1000 |
| 2 | 1 | 2026-01-15T10:00:00 | 2000 | 3000 |
| 3 | 1 | 2026-01-31T10:00:00 | 500 | 3500 |
| 4 | 1 | 2026-02-01T09:00:00 | 700 | 3200 |
| 5 | 2 | 2026-01-20T13:30:00 | 3500 | 3500 |
Как проверяем
Ваш запрос выполняется в PostgreSQL 16 прямо в браузере на 4 наборах данных: пример выше и скрытые — с NULL, повторами и пустыми таблицами. Нужен один
SELECT, можно с WITH. Сравниваем значения по порядку колонок, названия колонок могут быть свои. Порядок строк важен — как задано в условии.
tx_id, client_id, tx_at, amount_rub, sum_30d
Источник: на данных Сбера, по мотивам открытой подборки вопросов. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
Стр. 1Ctrl+Enter — запуск · Ctrl+Shift+Enter — отправка
Посмотреть данные, проверить кусок запроса. На зачёт не влияет.
Здесь появится результат отправки.