[英]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。 您的數據庫可能為此目的使用其他東西,例如TOP
或LIMIT
。
嘗試這個
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.