Выберите записи нужной валюты с rate_date не позже target_date, отсортируйте дату по убыванию и возьмите одну строку. Это вернёт последнее известное значение на указанную дату.
Получить актуальный валютный курс на заданную дату
Выберите записи нужной валюты с rate_date не позже target_date, отсортируйте дату по убыванию и возьмите одну строку. Это вернёт последнее известное значение на указанную дату.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Имеется таблица currency_rates со следующими колонками:
cur_code(строка, код валюты, например 'USD', 'EUR')rate_date(DATE, дата, для которой известен курс)exchange_rate(NUMERIC, значение курса)
В таблицу заносятся только те записи, где значение курса изменилось. Если для запрашиваемой даты нет строки, необходимо использовать ближайшую предыдущую дату с доступным курсом (например, если данных на 1‑й января нет, берём курс от 31‑го декабря).
Сформировать SQL‑запрос, принимающий параметры cur_code и target_date и возвращающий актуальный курс валюты.
Ответ
Выберите записи нужной валюты с rate_date не позже target_date, отсортируйте дату по убыванию и возьмите одну строку. Это вернёт последнее известное значение на указанную дату.
Запрос с параметрами, которые нужно привязать через драйвер:
SELECT exchange_rate, rate_date
FROM currency_rates
WHERE cur_code = :cur_code
AND rate_date <= :target_date
ORDER BY rate_date DESC
LIMIT 1;
Если предыдущего курса вообще нет, результат будет пустым: подставлять будущий курс нельзя. Желательно уникальное ограничение на (cur_code, rate_date); оно также даёт индекс для поиска. Без уникальности несколько разных курсов одной даты потребуют дополнительного правила выбора. Синтаксис placeholders зависит от драйвера.