2016-07-26 55 views
0

我想從表2中關閉日期與表2中最接近的日期(如果存在)對兩個表中的數據進行排序。表1中可能有ID-date,表2中沒有匹配,反之亦然。不保證是1:1的比賽。對於例如從T1我的數據會是這樣的:SAS-創建基於最小差異日期的唯一邂逅

ID time1 
A 01/09/2015 
A 02/16/2015 
B 03/03/2015 
C 04/01/2015 
C 01/20/2015 
C 03/15/2015 

T2相似:

ID time2 
A 01/29/2015 
A 02/19/2015 
B 03/06/2015 
C 01/27/2015 
C 03/18/2015 
C 04/04/2015 

的ID加入的時候,我不想要的是獨一無二的所有日期的組合,而這些組合中兩者之間的天數最小,例如。

desired_output:

ID date_time1 date_time2 
A 01/09/2015 01/29/2015 
A 02/16/2015 02/19/2015 
B 03/03/2015 03/06/2015 
C 01/20/2015 01/27/2015 
C 03/15/2015 03/18/2015 
C 04/01/2015 04/04/2015 

我不知道如何做到這一點,我已經試過選擇最大值和最小值,但只給出了類似的東西,這不是我想要的:

ID date_time1 date_time2 
A 01/09/2015 02/19/2015 
B 03/03/2015 03/06/2015 
C 01/20/2015 04/04/2015 

任何想法/建議如何做到這一點將不勝感激!謝謝!

回答

1

我使用了兩個內置的SAS數據集作爲示例,但這裏的一般想法是,您要比較t1中的組中的每個日期與t2中的同一id組中的每個日期,確定最小日期差異,並只保留那一個。

data t1 (keep = id date rename = date = time1); 
    set sasuser.admitjune; 
    if mod(_n_, 2) = 0 then id = "A"; 
     else id = "B"; 
run; 

data t2 (keep = id date rename = date = time2); 
    set sasuser.admitjune; 
    if mod(_n_, 2) = 0 then id = "B"; 
     else id = "A"; 
    date = date + 3; /*adjusting the dates so the datasets aren't the same*/ 
run; 

要做到這一點,你按升序排序的日期差異和nodup只保留最近的一個:

proc sql; 
    create table desired_output as select 
     a.id, a.time1, b.time2 as nearest_time2, 
     abs(b.time2-a.time1) as diff 
     from t1 as a 
     left join t2 as b 
     on a.id = b.id and b.time2 > a.time1 
     group by a.id, a.time1 
     order by calculated diff; 
    proc sort nodupkey; by id time1; 
quit; 
+0

你可能要一個'和b.time2> a.time1'您連接條件以確保'time2'事件在'time1'事件之後。 –

+0

我改變了一點說明,因爲我覺得我不清楚自己想要做什麼。我試圖對兩個表中的數據進行排序,將表1中的關閉日期與表2中最近的日期(如果存在)配對。但是這是一個很好的補充Chris J. – Brad

+0

因此,最接近的,你希望最接近的*下面的*日期(即,date2必須晚於date1)? – superfluous