Oracle SQL ближайшая дата к данной дате - PullRequest
0 голосов
/ 21 марта 2020

У меня есть таблица с колонкой для категорий, даты и цены. Например:

group 1  - 03.03.2019 - 5.00
group 1  - 03.02.2018 - 4.00
group 2  - 05.05.2019 - 2.25
group 2  - 05.05.2018 - 1.00

Таким образом, в группе всегда есть (почти) две даты с двумя разными ценами. Теперь мне нужно написать SQL заявление, чтобы получить самую близкую дату для группы к данной дате (например, 05.05.2019). Группа 1 имеет две даты, и оператор SQL должен выбрать одну из них, которая является ближайшей к данной дате. Это должно произойти для всех групп.

Я пробовал пару часов, но застрял. Спасибо за вашу помощь

Ответы [ 2 ]

2 голосов
/ 21 марта 2020

Вот один вариант с использованием not exists:

select t.*
from mytable t
where not exists (
    select 1
    from mytable t1
    where 
        t1.category = t.category 
        and greatest(t1.date, date '2019-05-05') - least(t1.date, date '2019-05-05')
            < greatest(t.date, date '2019-05-05') - least(t.date, date '2019-05-05')
)

Это дает вам «ближайшую» запись до 2019-05-05 для каждой группы (до или после).

Если, например, вам нужна ближайшая запись до 2019-05-05, это немного проще:

select t.*
from mytable t
where 
    t.date <= date '2019-05-05'
    and not exists (
        select 1
        from mytable t1
        where t1.category = t.category and t1.date <= date '2019-05-05' and t1.date > t.date
    )
1 голос
/ 21 марта 2020

Здесь вы можете использовать функцию ранга

select category, date_value, price from ( 
select category, date_value, price, 
rank() over (partition by category order by 
abs(to_date('2019-05-05','yyyy-mm-dd') - to_date(date_value, 'yyyy-mm-dd')) asc ) rnk
from yourtable )
where rnk = 1

db <> fiddle

...