ORACLE Запрос для поиска значения в другой таблице на основе дат - PullRequest
0 голосов
/ 24 мая 2018

У меня есть две таблицы, в таблице A есть идентификатор и дата события, а в таблице B - идентификатор, описание и дата события.Не все идентификаторы в таблице A отображаются в таблице B, а некоторые идентификаторы появляются в таблице B несколько раз с различными описаниями для каждого события.Описание в таблице B - это атрибут, который может изменяться со временем. Дата события в таблице B - это дата, когда описание данного идентификатора изменяется со своего значения по умолчанию (хранящегося в другой таблице) на новое значение.Я хочу найти описание в таблице B, которое соответствует дате события в таблице A, поэтому, например,

Данные образца таблицы

A1234 вернет зеленый, а A4567 вернетNull

Я не могу создать таблицы здесь, поэтому мне нужно это сделать с помощью запроса.

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Этот запрос выберет последнее описание перед событием:

SELECT * FROM (
  SELECT tabA.id, tabA.event_date, tabB.description,
    ROW_NUMBER() OVER(PARTITION BY tabB.id ORDER BY tabB.event_date DESC) rn
  FROM Table_A tabA 
  LEFT JOIN Table_B tabB ON tabA.id = tabB.id AND tabB.event_date <= tabA.event_date
) WHERE rn = 1
0 голосов
/ 24 мая 2018

Если я хорошо понимаю ваши потребности, это может быть следующим способом:

select a.id, description
from tableA A
        left join 
         (select id,
                 description,
                 event_date from_date,
                 lead(event_date) over (partition by id order by event_date) -1 as to_date
          from tableB
         ) B
         on (A.id = B.id and a.event_date between b.from_date and b.to_date)

Идея состоит в том, чтобы оценить для каждой строки в tableB диапазон дат, для которого эта строка, и ееописание, действительно;учитывая это, простое соединение должно делать эту работу.

0 голосов
/ 24 мая 2018

Вы можете покинуть таблицы соединения, как:

select a.ID , b1.DESCRIPTION 
from TABLE_A a
left join TABLE_B b1 on a.ID = b1.id and a.EVENT_DATE > b1.EVENT_DATE
left join TABLE_B b2 on a.ID = b2.id and b1.EVENT_DATE < b2.EVENT_DATE and a.EVENT_DATE > b2.EVENT_DATE
where b1.id is null or b2.EVENT_DATE is null;
...