2016-07-26 54 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