Вы не привели пример желаемого результата. Можно предположить, что нужно что-то такое.
Если решать без использования оконных функций, сперва выберем ближайшие к заданной дате+времени даты+время из таблицы. Потом соединяем INNER JOIN с основной таблицей для получения значения rate на это время.
create table test (CurrName varchar(10),rate float,updated datetime);
insert into test values
('USD',0.9 ,'2023-03-03 13:30:1')
,('USD',0.99,'2023-03-04 13:30:1')
,('USD',0.97,'2023-03-06 13:30:1')
,('EUR',0.8 ,'2023-03-03 13:30:1')
,('EUR',0.89,'2023-03-05 13:30:1')
,('EUR',0.87,'2023-03-06 13:30:1')
,('JPY',0.108 ,'2023-03-03 13:30:1')
,('JPY',0.129,'2023-03-05 13:30:1')
,('JPY',0.137,'2023-03-06 13:30:1')
;
select t1.currname,updated,rate
from (
select currname,max(updated) date1
from test
where updated<=cast('2023-03-05 13:30:1' as datetime)
group by currname
)t1
inner join test t2
on t1.currname=t2.currname
and t1.date1=t2.updated
Результат запроса
currname |
updated |
rate |
USD |
2023-03-04 13:30:01.000 |
0.99 |
JPY |
2023-03-05 13:30:01.000 |
0.129 |
EUR |
2023-03-05 13:30:01.000 |
0.89 |