2013-05-20 51 views
0

我需要執行一個LEFT JOIN以通過將表B中具有日期滯後日期的新變量加入到日期中來引入表B中的變量:根據滯後日期加入表格

表A:

Date Var1 
1/3/07 1 

表B:

Date Var2 
1/2/07 2 
1/3/07 3 

連接表:

Date Var1 Var2 
1/3/07 1 2 

我需要爲數千個日期執行此操作。這不起作用:

proc sql; 
create table data.Join as 
select a.*, b.Var2 
from data.A a left join data.B b 
on a.Date=b.Date 
where a.Date=lag(b.Date,1); 
quit; 
+0

你正在使用什麼[RDBMS](http://en.wikipedia.org/wiki/Relational_database_management_system)? 'RDBMS'代表*關係數據庫管理系統*。 'RDBMS是SQL'的基礎,對於所有現代數據庫系統,如MS SQL Server,IBM DB2,Oracle,MySQL等等...... –

+0

RDBMS與解決方案的容易程度有關。該版本太多,例如SQL Server 2008或SQL Server 2012 – gbn

+0

LAG不會做你認爲它的作用。在這種情況下,SQL本機解決方案在SAS中可以正常工作。 LAG僅適用於數據步驟(即使此時也不會做你想做的事情)。 – Joe

回答

2

您正在使用SAS proc SQL,據推測。在此,您可以對日期進行常規算術運算,因此- 1表示減去一天。你可以試試這個:

Select A.Date, A.Var1, B.Var2 
From A left outer join 
    B 
    On A.Date = B.Date + 1 

如果沒有匹配,則left outer join將保持行和第三列中插入NULL。

+0

非常好,非常感謝! – Sassafras

+0

只是另一個問題:您的代碼有效,但有些與表B中滯後的1日期不匹配,因爲它落在星期一。例如,表A中的1/15/07需要與表B中的1/12/07匹配。但是,當您將上面的代碼更改爲+ 3時,它不匹配。爲什麼? – Sassafras

+0

@SASnewby。 。 。那麼,這些值應該匹配。你確定「日期」沒有時間分量嗎?這會爲該值添加小數點,通常會阻止匹配。如果這是一個問題,那麼做:'on datepart(a.date)= datepart(b.date)​​'。 –

0
Select A.Date,A.Var1,B.Var2 From A 
left join B On A.Date = B.Date 
Where A.Date = ? 

鑑於VAR2空的,如果有在表中的記錄是好的,如果你不想要一個內部聯接,而不是一個左一個。

只是注意到滯後所以而不是A.Date = B.date,你會使用任何意思,需要知道DBMS的確切語法。