簡體   English   中英

SQL連接在相等或最接近的日期

[英]SQL join on equal or closest date

我有兩張桌子

表A(每個ID 1行)

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

表b(每個ID多行,但每個ID /日期組合唯一)

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

這樣做的一種典型方法是使用相關的子查詢,每個子查詢一個:

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 )。 一個更復雜的方法涉及join和group by ,我不建議這樣做。

請注意, fetch first 1 row only是ANSI SQL。 您的數據庫可能為此目的使用其他東西,例如TOPLIMIT

嘗試這個

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM