Я бы сделал это с помощью подзапроса, который получит price_usd
из crypto
, где совпадают коды валют и абсолютное значение разности отметок времени равноминимум разницы временных меток для кода валюты.Мы получаем этот минимум в другом подзапросе.
SELECT p.date_hour,
p.currency,
p.bal_conf,
(SELECT c.price_usd
FROM crypto c
WHERE c.crypto_code = p.currency
AND (SELECT min(abs(timestampdiff(second, ci.date_hour, p.date_hour)))
FROM crypto ci
WHERE ci.crypto_code = p.currency)
= abs(timestampdiff(second, c.date_hour, p.date_hour))
ORDER BY c.date_hour DESC
LIMIT 1) price_usd
FROM production p;
ORDER BY c.date_hour DESC LIMIT 1
просто обрабатывает редкое событие, когда две или более меток времени из crypto
производят одинаковую разницу для данной метки времени из производства.В таком случае используется самая последняя отметка времени.
Индексы для поддержки этого запроса могут быть
CREATE INDEX crypto_crypto_code_date_hour
ON crypto
(crypto_code,
date_hour);
для самого внутреннего подзапроса и
CREATE INDEX crypto_crypto_code_date_hour_price_usd
ON crypto
(crypto_code,
date_hour,
price_usd);
длявнешний подзапрос.(И ничего для внешнего запроса, так как нет условий для production
.)