Войти Регистрация
Data base

216. Валютные операции в рублях по последнему курсу

Сложная

В ops — операции клиентов в рублях, долларах, евро и юанях. В rates — официальные курсы ЦБ: сколько рублей стоит единица валюты на дату. ЦБ не устанавливает курс на выходные и праздники, поэтому строк на эти даты нет. Для рубля строк в rates нет вовсе, его курс — 1.

Переведите каждую операцию в рубли по курсу на дату операции, а если на эту дату курса нет — по последнему курсу до неё. Округлите каждую операцию до копеек и сложите по клиенту. Если курса нет ни на дату, ни раньше, операцию в сумму не берите, а посчитайте в колонке skipped. Верните client_id, total_rub (0, если сложить нечего), skipped, порядок — по client_id.

В работе: Выписка для налоговой декларации: доходы в валюте пересчитывают по курсу ЦБ на дату получения.

Таблицы

ops — одна строка — одна операция

КолонкаТипЧто значит
op_idintключ
client_idintклиент
op_datedateдата операции
currencytextRUB / USD / EUR / CNY
amountnumericсумма в валюте операции

rates — курсы ЦБ, только рабочие дни

КолонкаТипЧто значит
currencytextвалюта
rate_datedateдата курса
rub_per_unitnumericрублей за единицу

Пример: данные

ops · 5 строк

op_idclient_idop_datecurrencyamount
112026-03-05USD120
212026-03-06EUR35,5
312026-03-06RUB4500
422026-03-06CNY1999,99
522026-03-06USD10,01

rates · 4 строки

currencyrate_daterub_per_unit
USD2026-03-0581,2345
USD2026-03-0681,5012
EUR2026-03-0688,0731
CNY2026-03-0611,2264

Ожидаемый ответ

client_idtotal_rubskipped
117374,740
223268,520
Как проверяем Ваш запрос выполняется в PostgreSQL 16 прямо в браузере на 6 наборах данных: пример выше и скрытые — с NULL, повторами и пустыми таблицами. Нужен один SELECT, можно с WITH. Сравниваем значения по порядку колонок, названия колонок могут быть свои. Порядок строк важен — как задано в условии.
client_id, total_rub, skipped
LEFT JOINподзапросдатыNULLусловная агрегация

Источник: наша задача на данных Т‑Банка: валютные операции и курсы ЦБ. Условие пересказано своими словами.