Ближайшее значение одного столбца для имени в другом столбце
Есть вот такая таблица. Как из неё сделать таблицу из 3х строчек (по одной на каждое имя) с некоторым условием на 3й столбец таблицы? То есть, updated < некоторой даты. В итоге надо получить таблицу из 3х строк с ближайшей меньшей датой из стартовой таблицы для каждого 'name'
Ответы (2 шт):
То есть, насколько я понял, нужно вывести ту дату для каждой группы, которая будет максимальна, но меньше, чем заданная дата. Это можно сделать, например, так:
SELECT name, MAX(updated)
FROM table
WHERE updated < some_date
GROUP BY name;
Названия таблицы вы не привели, поэтому я использовал table. В качестве даты some_date, соответственно, подставляете нужную дату.
Вы не привели пример желаемого результата. Можно предположить, что нужно что-то такое. Если решать без использования оконных функций, сперва выберем ближайшие к заданной дате+времени даты+время из таблицы. Потом соединяем 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 |
