2016-02-24 2 views
1

У меня есть две таблицыSQL присоединиться на равной или близкой дате

Таблица A (1 строку для каждого ID)

id,observation_date 
a,2015-03-01 
b,2015-03-03 
c,2015-03-05 

таблице B (несколько строк на идентификатор, но уникальный для каждого идентификатора/комбинации даты)

id, insert_date, value 
a,2015-02-28,x1 
a,2015-03-01,x2 
a,2015-03-02,x3 
b,2015-02-28,x4 
b,2015-03-01,x5 
b,2015-03-02,x6 
c,2015-02-28,x7 
c,2015-03-01,x8 
c,2015-03-02,x9 
c,2015-03-03,x10 
c,2015-03-04,x11 

Я хочу присоединиться к этим таблицам по идентификатору, но и, а не вступление в сроках, я хочу присоединиться на самом последнюю дату вставки из таблицы б в отношении даты наблюдений в таблице в (где дате либо до, либо в тот же день, что и срок наблюдения)

т.е. на выходе должно быть:

id,observation_date,insert_date,value 
a,2015-03-01,2015-03-01,x2 
b,2015-03-03,2015-03-02,x6 
c,2015-03-05,2015-03-04,x11 
+0

Пожалуйста, помечать свой вопрос с базой данных, которую вы используете. –

ответ

1

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

select a.*, 
     (select b.date 
     from b 
     where b.id = a.id and b.insert_date <= a.observation_date 
     order by b.insert_date desc 
     fetch first 1 row only 
     ) as insert_date, 
     (select b.value 
     from b 
     where b.id = a.id and b.insert_date <= a.observation_date 
     order by b.insert_date desc 
     fetch first 1 row only 
     ) as value 
from a; 

Два похожи методы также доступны. Используйте коррелированный подзапрос, чтобы получить дату, а затем присоединитесь к таблице, чтобы получить остальные значения. Или, если ваша база данных поддерживает его, используйте боковые соединения (используя apply в SQL Server). Более сложный метод включает объединения и group by, что я не рекомендую.

Обратите внимание, что fetch first 1 row only - это ANSI SQL. Ваша база данных может использовать что-то еще для этой цели, например TOP или LIMIT.

1

Попробуйте

SELECT * 
FROM TABLEA TA 
INNER JOIN TABLEB TB 
    ON TA.ID=TB.ID 
    AND TB.INSERT_DATE = 
      (SELECT MAX(TB_E.INSERT_DATE) FROM TABLEB TB_E WHERE TB_E.ID=TB.ID AND TA.OBSERVATION_DATE >= TB_E.INSERT_DATE) 
Смежные вопросы