Date 根据参考号和最近日期加入记录
我有两张桌子。一是关于发出信件的信息。其中最多有两个个人参考号(两列,Person1和Person2)和估计的门垫放置日期。第二个表是收到的呼叫列表。这有打电话的人的个人参考号码(可以是第一个表中的person1或person2)和接到电话的日期。因此: 信件: 人1 人2 门楣 电话: 人 日期 每个小组可以收到多封信,每个人可以打多个电话。哦,更复杂的是,每个人都可以出现在不同的群体中,与不同的人在一起,或者单独出现 我需要做的是匹配/加入每个电话,一次又一次,到该人最近收到的信(无论他们是否占用person1或person2列),以便电话在信之后(我们正在查看联系人生成)。它不产生联系的地方和它产生联系的地方一样重要,所以我认为左/右连接是合适的 我能想到的唯一方法是在这两个表上都创建一个唯一的参考号,在两个表之间执行联接,这给了我一年中每个人的所有可能的字母和电话组合,计算以天为单位的差异,并取每个电话的最小差异。这将是非常处理器密集型的,我不认为这会使匹配变得独特(有些情况下,字母多于呼叫,因此我认为同一个呼叫可能会被匹配两次?!) 有什么想法吗?我不能完全理解这一点Date 根据参考号和最近日期加入记录,date,join,sas,Date,Join,Sas,我有两张桌子。一是关于发出信件的信息。其中最多有两个个人参考号(两列,Person1和Person2)和估计的门垫放置日期。第二个表是收到的呼叫列表。这有打电话的人的个人参考号码(可以是第一个表中的person1或person2)和接到电话的日期。因此: 信件: 人1 人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 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联系比率我需要第二次呼叫与第二个字母匹配,因为第一次呼叫与第一个字母匹配。