Ближайшее значение одного столбца для имени в другом столбце

Рейтинг: 0Ответов: 2Опубликовано: 22.04.2023

введите сюда описание изображения

Есть вот такая таблица. Как из неё сделать таблицу из 3х строчек (по одной на каждое имя) с некоторым условием на 3й столбец таблицы? То есть, updated < некоторой даты. В итоге надо получить таблицу из 3х строк с ближайшей меньшей датой из стартовой таблицы для каждого 'name'

Ответы

▲ 0

То есть, насколько я понял, нужно вывести ту дату для каждой группы, которая будет максимальна, но меньше, чем заданная дата. Это можно сделать, например, так:

SELECT name, MAX(updated)
FROM table
WHERE updated < some_date
GROUP BY name;

Названия таблицы вы не привели, поэтому я использовал table. В качестве даты some_date, соответственно, подставляете нужную дату.

▲ 0

Вы не привели пример желаемого результата. Можно предположить, что нужно что-то такое. Если решать без использования оконных функций, сперва выберем ближайшие к заданной дате+времени даты+время из таблицы. Потом соединяем 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