根据参考编号和最近日期连接记录

时间:2016-03-09 13:52:56

标签: date join sas

我有两张桌子。一个是发出的信件的信息。它最多有两个个人参考号码(两列,Person1和Person2)和估计的门垫掉落日期。第二个表是收到的呼叫列表。这具有拨打电话的人的个人参考号码(可以是第一个表中的person1或person2)以及接收呼叫的日期。所以:

快报: PERSON1 PERSON2 DoormatDate

呼叫: 人 日期

每个小组可以收到多个字母,每个人可以拨打多个电话。哦,只是为了使事情进一步复杂化,每个人可以出现在不同的人群中,例如他们自己或者他们自己。

我需要做的是匹配/加入每次通话,只需一次,即可收到该人收到的最近一封信(无论他们是否占用person1或person2列),以便通话发出(我们正在研究联系人的产生。它没有产生联系的地方和它所做的一样重要,所以我认为左/右连接将是有序的。

我能够想到接近这一点的唯一方法是在两者上创建一个唯一的参考号,在两个表之间执行连接,为每个人提供所有可能的字母和电话组合这一年,计算每天的差异,并采取每次通话的最小差异。这将是处理器密集型的,我不认为会使匹配变得独一无二(有些情况下会有更多的信件而非呼叫,所以我认为同一个呼叫最终可能会被匹配两次?!)。

有什么想法吗?我无法理解这一点。

提前致谢。

1 个答案:

答案 0 :(得分:2)

因此,如果您的记录数量不是太大,我认为您可以使用受限制的笛卡尔积,然后使用数据步骤(只是SAS-y)。

我假设表格是

Letters (
   letter_id ,
   person1 ,
   person2 ,
   DoorMatDate
)

Calls (
   call_id ,
   person ,
   CallDate
)

在计算距离时也要进行连接。订购结果。

proc sql noprint;

create table letters_x_calls as
select a.letter_id,
       b.call_id,
       b.person,
       b.CallDate,
       a.DoorMatDate,
       b.CallDate - a.DoorMatDate as timeToCall
    from letters as a,
         calls as b
    where (b.person = a.person1 or b.person = a.person2)
      and b.CallDate > a.DoorMatDate
    order by call_id, timeToCall;

quit;

然后使用带有by语句的Data Step仅保留第一条记录。

data letters_x_calls;
   set letters_x_calls;
   by call_id timetocall;

   if first.call_id;
run;

显然,您可以在SQL中计算min(timeToCall)并使用HAVING语句来执行此操作。