SAS实现Office签证申请前最新申请渠道的标记需求咨询
SAS实现Office签证申请前最新申请渠道的标记需求咨询
看起来你需要从签证申请数据里,为每一条「Office渠道」的申请记录,匹配到该申请人(同一个MasterId)在这次Office申请之前的最后一次申请渠道对吧?我理解你的需求了,咱们可以用SAS的PROC SQL或者数据步来实现,下面给你两种方案参考:
先明确你的数据逻辑:比如对于MasterId=A的Office申请(Id=A2,日期31-Jan-22),我们要找的是A的所有早于31-Jan-22的申请里,日期最新的那条(也就是A3,12-Dec-21)的Method(Online),然后把这个值放到A2记录对应的蓝色字段里。
方案1:用PROC SQL实现(简洁直观)
proc sql; create table want as select t1.*, /* 子查询获取当前Office记录对应的前置最新渠道 */ (select t2.Method from have t2 where t2.MasterId = t1.MasterId and t2.Apply_date < t1.Apply_date order by t2.Apply_date desc fetch first 1 row only) as Previous_Method from have t1 /* 如果只需要Office记录的结果,就加这个where条件;如果要保留所有记录,就去掉 */ /* where t1.Method = 'Office' */ order by t1.MasterId, t1.Apply_date desc; quit;
代码解释:
- 主查询遍历每条记录,对于每条记录(尤其是Method='Office'的),子查询会在同一个MasterId下,筛选出所有日期早于当前记录的申请,按日期降序排序后取第一条的Method,也就是最新的前置申请渠道。
- 如果只需要Office记录的结果,就加上
where t1.Method = 'Office';如果想保留所有记录,同时给Office记录标记前置渠道,就去掉这个条件。
方案2:用数据步实现(适合复杂逻辑扩展)
/* 先按MasterId分组,按Apply_date降序排序,这样最新的申请在最前面 */ proc sort data=have out=sorted_have; by MasterId descending Apply_date; run; data want; set sorted_have; by MasterId; /* 保留前一条记录的Method,用来追踪前置渠道 */ retain last_non_office_method; /* 每个MasterId组开始时,重置保留变量 */ if first.MasterId then do; last_non_office_method = ''; end; /* 如果当前记录不是Office,就更新保留变量为当前Method */ if Method ne 'Office' then do; last_non_office_method = Method; end; /* 如果当前记录是Office,就把保留的变量赋值给Previous_Method */ else do; Previous_Method = last_non_office_method; end; /* 保留需要的变量,或者根据需求调整 */ drop last_non_office_method; run;
代码解释:
- 先把数据按MasterId分组,申请日期降序排序,这样每个MasterId下最新的申请排在最前面。
- 用
retain变量来记录最近一次非Office渠道的申请方式:- 每个MasterId组开始时,重置变量为空;
- 遇到非Office的记录,就更新变量为当前的Method;
- 遇到Office的记录,就把之前记录的最新非OfficeMethod赋值给
Previous_Method。
- 最后可以根据需求保留或删除临时变量。
验证结果
拿你的示例数据来说,运行后得到的结果应该是:
- A2(Office)的Previous_Method是Online(对应A3的记录)
- B1(Office)的Previous_Method是Kiosk(对应B2的记录)
- C3(Office)的Previous_Method是Kiosk(对应C2的记录)
这样就正好匹配你想要的蓝色部分的结果啦。
备注:内容来源于stack exchange,提问作者sunnyday
相关产品推荐
相关产品推荐

