Date 根据参考号和最近日期加入记录

Date 根据参考号和最近日期加入记录,date,join,sas,Date,Join,Sas,我有两张桌子。一是关于发出信件的信息。其中最多有两个个人参考号(两列,Person1和Person2)和估计的门垫放置日期。第二个表是收到的呼叫列表。这有打电话的人的个人参考号码(可以是第一个表中的person1或person2)和接到电话的日期。因此: 信件: 人1 人2 门楣 电话: 人 日期 每个小组可以收到多封信,每个人可以打多个电话。哦,更复杂的是,每个人都可以出现在不同的群体中,与不同的人在一起,或者单独出现 我需要做的是匹配/加入每个电话,一次又一次,到该人最近收到的信(无论他们是

我有两张桌子。一是关于发出信件的信息。其中最多有两个个人参考号(两列,Person1和Person2)和估计的门垫放置日期。第二个表是收到的呼叫列表。这有打电话的人的个人参考号码(可以是第一个表中的person1或person2)和接到电话的日期。因此:

信件: 人1 人2 门楣

电话: 人 日期

每个小组可以收到多封信,每个人可以打多个电话。哦,更复杂的是,每个人都可以出现在不同的群体中,与不同的人在一起,或者单独出现

我需要做的是匹配/加入每个电话,一次又一次,到该人最近收到的信(无论他们是否占用person1或person2列),以便电话在信之后(我们正在查看联系人生成)。它不产生联系的地方和它产生联系的地方一样重要,所以我认为左/右连接是合适的

我能想到的唯一方法是在这两个表上都创建一个唯一的参考号,在两个表之间执行联接,这给了我一年中每个人的所有可能的字母和电话组合,计算以天为单位的差异,并取每个电话的最小差异。这将是非常处理器密集型的,我不认为这会使匹配变得独特(有些情况下,字母多于呼叫,因此我认为同一个呼叫可能会被匹配两次?!)

有什么想法吗?我不能完全理解这一点


提前感谢。

因此,如果您的记录数量不是太多,我认为您可以使用受约束的笛卡尔积,然后使用数据步骤(仅限于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 letters_x_calls;
   set letters_x_calls;
   by call_id timetocall;

   if first.call_id;
run;

显然,您可以在SQL中计算
min(timeToCall)
并使用
HAVING
语句来实现这一点。

使用标记dbms。(许多产品在日期/时间方面远远不符合ANSI SQL。)它是sas,尽管我使用它时倾向于用SQL编写。如果我删除SQL引用,会不会让每个人都不那么困惑?我已经删除了SQL,只是为了防止混淆。我想你是对的,这更多是一个优化问题,而不是一个查询问题。我们在每个表中讨论了多少条记录?我不得不将其分解以使其正常工作(我试着在一夜之间运行整个系统,17小时后它仍在运行)因此,我每月对信件数据进行分解,并针对当月和未来三个月运行这些数据。这仍然需要几个小时,但SAS似乎可以管理。将这些数据重新添加到一起并不是什么大问题。因为我对没有电话的情况感兴趣,我将把这些记录重新匹配到主信件数据库u在字母_id上唱一首左手连接。谢谢。很乐意帮助。如果我想到一种更快的方法,我会发布它。保留距离度量。在附加结果后,使用并重新运行该数据步骤以保留距离最小的一个。我刚刚意识到像这样拆分它有问题。这会有匹配的风险将同一个调用匹配到不同的字母。我想我可能可以整理一下,但这需要一个非常迭代的过程(包括从未来的数据集中删除已经匹配的调用)嗯,对不起,我搞乱了对话的顺序。我想的例子是1月17日:信函,2月21日:信函,2月23日:呼叫25日:呼叫。我想这两个字母都会与2月23日的电话相匹配。我想没有办法绕过这一点。我可以划掉第二个字母,但考虑到我正在努力ure联系比率我需要第二次呼叫与第二个字母匹配,因为第一次呼叫与第一个字母匹配。