基于重新申请逻辑标记签证账户(一人多申请场景)技术咨询
SAS解决方案:签证申请30天内重申判定
核心思路
- 按申请者ID分组,对每个申请者的申请记录按日期升序排序,保证记录顺序符合申请时间线
- 使用
lag()函数提取上一次申请的日期与渠道,用于当前记录的比对 - 计算当前申请与上一次申请的间隔天数,判断是否≤30天,生成「是否重申」标记
- 同步记录符合条件的重申渠道与日期
完整SAS代码
/* 先对原始数据按ID和申请日期排序,保证时间顺序正确 */ proc sort data=have; by Id Apply_date; run; /* 生成重申判定结果 */ data want; set have; by Id; format prev_apply_date date9. reapply_date date9.; /* 提取上一次申请的日期和渠道 */ prev_apply_date = lag(Apply_date); prev_channel = lag(Channel); /* 初始化变量 */ if first.Id then do; reapply_flag = "否"; reapply_channel = ""; reapply_date = .; call missing(prev_apply_date, prev_channel); end; else do; /* 计算间隔天数,判断是否在30天内 */ if (Apply_date - prev_apply_date) <= 30 then do; reapply_flag = "是"; reapply_channel = Channel; reapply_date = Apply_date; end; else do; reapply_flag = "否"; reapply_channel = ""; reapply_date = .; end; end; run;
代码说明
- 排序步骤:通过
proc sort按Id和Apply_date排序,确保每个申请者的记录按申请时间先后排列,这是后续滞后函数生效的前提 - 滞后函数:
lag(Apply_date)和lag(Channel)分别获取当前记录的上一条记录的申请日期和渠道,仅当同ID下存在上一条记录时有效 - 分组处理:利用
by Id语句的first.Id标识,对每个申请者的第一条申请初始化变量(首次申请无前置记录,标记为「否」) - 间隔判断:计算当前申请与上一次申请的日期差,≤30天时标记为「是」,并记录当前申请的渠道和日期;否则标记为「否」
输出结果示例
| Id | Channel | Apply_date | reapply_flag | reapply_channel | reapply_date |
|---|---|---|---|---|---|
| SAM1D | Online | 01-OCT-22 | 否 | ||
| SAM1D | Kiosk | 09-OCT-22 | 是 | Kiosk | 09-OCT-22 |
| PETE5O | Office | 05-AUG-22 | 否 | ||
| PETE5O | Kiosk | 06-SEP-22 | 否 | ||
| PETE5O | Online | 08-SEP-22 | 是 | Online | 08-SEP-22 |
| PETE5O | Kiosk | 05-OCT-22 | 是 | Kiosk | 05-OCT-22 |
内容的提问来源于stack exchange,提问作者sunnyday
相关产品推荐
相关产品推荐

