Соедините 2 таблицы, где правая дата является наибольшей датой, меньшей или равной левой дате - PullRequest
0 голосов
/ 03 мая 2019

У меня есть 2 таблицы, которые я хотел бы объединить в Oracle SQL:

Table A:
DATE        VALUE
02-May-19   19.25
03-May-19   19.35
04-May-19   19.37
06-May-19   19.45
11-May-19   19.30
01-Jun-19   18.79
01-Jul-19   19.33

Table B:
DATE        VALUE
02-May-19   11.08
01-Jun-19   11.09
01-Jul-19   11.11

Я могу оставить внешнее соединение с ними, чтобы получить оба значения, где даты совпадают:

select a."date" as "DATE", a.value as a_value, b.value as b_value
from a 
left outer join b on b."date" = a."date"
;

DATE        A_VALUE B_VALUE
02-May-19   19.25   11.08
03-May-19   19.35   
04-May-19   19.37   
06-May-19   19.45   
11-May-19   19.30   
01-Jun-19   18.79   11.09
01-Jul-19   19.33   11.11

То, что я хотел бы сделать, это то, где дата не существует в таблице B, взять лучшее доступное значение b.value, где b. "Date" <= a. "Date".Вот так: </p>

DATE        A_VALUE B_VALUE
02-May-19   19.25   11.08
03-May-19   19.35   11.08
04-May-19   19.37   11.08
06-May-19   19.45   11.08
11-May-19   19.30   11.08
01-Jun-19   18.79   11.09
01-Jul-19   19.33   11.11

Ответы [ 3 ]

1 голос
/ 03 мая 2019

Возможно, самый простой метод - это коррелированный подзапрос:

select a.*,
       (select max(b.value) keep (dense_rank first order by b.date desc)
        from b
        where b.date <= a.date
       ) b_value
from a;
1 голос
/ 03 мая 2019

В вашем запросе вы можете добавить функцию задержки с опцией игнорирования нулей:

select a."date"
     , a."value"
     , coalesce(b."value", lag(b."value") ignore nulls over (order by a."date")) as best_match_value
from a 
left outer join b on b."date" = a."date"
order by a."date";
0 голосов
/ 03 мая 2019

использовать month() и year() функцию в состоянии соединения

select a.date, a.value, b.value 
from a 
left outer join b 
on EXTRACT(month FROM b.date)=EXTRACT(month FROM a.date) 
and EXTRACT(year FROM b.date)=EXTRACT(yearFROM a.date)
...