如何在SAS Enterprise Guide的PROC SQL中生成状态变更0/1标记列
在SAS Enterprise Guide中用PROC SQL实现COL1列的生成需求
你需要基于table123生成COL1列,核心规则是:当同一ID下出现从VAL1=PR变更为VAL2=P/M的记录,且后续没有在4个月内改回VAL1=PR的情况,该ID的所有记录COL1为1;其他情况COL1为0。
以下是实现该需求的PROC SQL代码:
PROC SQL; CREATE TABLE desired_result AS SELECT t1.ID, t1.DT, t1.VAL1, t1.VAL2, CASE /* 先筛选出存在PR转P/M变更的ID */ WHEN t1.ID IN ( SELECT DISTINCT ID FROM table123 WHERE VAL1 = 'PR' AND VAL2 IN ('P','M') ) /* 再判断该ID后续是否没有在4个月内改回PR */ AND NOT EXISTS ( SELECT 1 FROM table123 t2 WHERE t2.ID = t1.ID AND t2.DT > t1.DT AND t2.VAL1 = 'PR' /* 把数值型DT转为SAS日期,计算月份差 */ AND INTCK('MONTH', INPUT(PUT(t1.DT,8.), YYMMDD8.), INPUT(PUT(t2.DT,8.), YYMMDD8.)) <= 4 ) THEN 1 ELSE 0 END AS COL1 FROM table123 t1 ORDER BY t1.ID, t1.DT; QUIT;
代码逻辑拆解
筛选目标ID
子查询先找出所有发生过「VAL1=PR→VAL2=P/M」变更的ID,例子中的123、222会被选中,38、991直接排除。验证改回时间
通过NOT EXISTS子查询检查:当前ID的每条记录之后,是否存在VAL1变回PR且时间间隔≤4个月的记录。如果不存在,说明改出PR后超过4个月未改回,符合COL1=1的条件。- 用
INPUT(PUT(DT,8.), YYMMDD8.)把数值型的DT转换为SAS可识别的日期格式,再用INTCK函数精准计算月份差,避免日期格式误差。
- 用
CASE语句输出结果
只有同时满足「存在PR转P/M变更」和「后续4个月内未改回PR」的ID,所有记录的COL1才会设为1,其余情况均为0。
对应示例结果的验证
- ID=123:存在PR转P的记录,后续记录距离变更日期的月份差为7个月,且无改回PR的记录,因此COL1全为1。
- ID=222:虽有PR转M的变更,但后续仅2个月就改回PR,因此COL1全为0。
- ID=38:未发生PR转P/M的变更,COL1为0。
- ID=991:初始VAL1不是PR,无符合规则的变更,COL1为0。
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

