SAS技术问询:筛选无24小时前置家庭联系的商务号码记录
我来帮你搞定这个SAS数据筛选的需求,这里有两种实用的方法,分别用DATA步和PROC SQL实现,都能精准得到你想要的结果:
方法一:使用DATA步(高效直观)
这种方法通过排序+保留最近的家庭号码记录时间,快速判断商务号码是否符合条件,执行效率很高。
首先我们先对数据集按客户ID和记录时间排序,保证按顺序处理每个客户的记录:
PROC SORT DATA=HAVE; BY ID RECORD; RUN;
然后用DATA步处理,核心是用RETAIN语句跟踪每个客户最近的家庭号码(TYPE=H)记录时间,再对比商务号码(TYPE=B)的时间:
DATA WANT; SET HAVE; BY ID; RETAIN LAST_H_TIME; /* 保留每个客户最近的H类型记录时间 */ /* 切换到新客户时,重置最近H记录的时间 */ IF FIRST.ID THEN LAST_H_TIME = .; /* 如果是H类型记录,更新最近时间并直接删除(我们不需要保留H记录) */ IF TYPE = 'H' THEN DO; LAST_H_TIME = RECORD; DELETE; END; /* 如果是B类型记录,检查距离最近H记录的时间是否超过24小时(86400秒) */ ELSE IF TYPE = 'B' THEN DO; /* 要么从来没有H记录,要么最近的H记录比当前B记录早超过24小时,就保留这条B记录 */ IF MISSING(LAST_H_TIME) OR (RECORD - LAST_H_TIME) > 86400 THEN OUTPUT; END; RUN;
方法二:使用PROC SQL(子查询方式)
如果你更习惯SQL语法,可以用NOT EXISTS子查询来判断每个B记录的24小时内是否存在前置H记录:
PROC SQL; CREATE TABLE WANT AS SELECT a.* FROM HAVE a WHERE a.TYPE = 'B' AND NOT EXISTS ( /* 子查询:检查同一个客户下,是否存在H记录在当前B记录的前24小时内 */ SELECT 1 FROM HAVE b WHERE b.ID = a.ID AND b.TYPE = 'H' AND b.RECORD BETWEEN (a.RECORD - 86400) AND a.RECORD ); QUIT;
这个逻辑很直接:对于每一条B记录,只要找不到同一个客户在它的前24小时内的H记录,就把这条B记录保留下来。
验证结果
两种方法运行后得到的WANT数据集都会和你期望的输出完全一致:
1 20MAY2018:06:24:28 B
2 24MAY2018:06:24:28 B
5 29MAY2018:07:24:28 B
5 29MAY2018:08:24:28 B
内容的提问来源于stack exchange,提问作者mooch81
相关产品推荐
相关产品推荐

