SQL连接在相同或最近的日期

时间:2016-02-24 01:14:51

标签: sql date join conditional nearest-neighbor

我有两张桌子

表a(每个id 1行)

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

表b(每个id多行,但每个id / date组合唯一)

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上加入这些表,但是我想加入我希望在表b中与表a中的观察日期相关的最近插入日期加入的日期(其中日期在之前或之前)与观察日期同一天)

即。输出应该是:

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

2 个答案:

答案 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;

也有两种类似的方法。使用相关子查询获取日期,然后联接回表以获取其余值。或者,如果您的数据库支持它,请使用横向连接(在SQL Server中使用apply)。一个更复杂的方法涉及连接和group by,我不推荐。

请注意fetch first 1 row only是ANSI SQL。您的数据库可能会为此目的使用其他内容,例如TOPLIMIT

答案 1 :(得分: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)