如何根据SAS Enterprise Guide中PROC SQL中某些日期的值是否在2列之间更改来创建0/1标志开关



我在SAS Enterprise Guide中有如下表格。表显示了客户的历史记录以及他对所使用服务的最终更改(列:BEFORE,AGAIN(。

ID和DT没有排序,但如果它是重要的,则可能是

列的数据类型:

  • ID-数字
  • DT-日期
  • BEFORE-字符
  • AFTER-字符
PP公共关系
ID DT BEFORE AFTER
123 2021年5月21日 PR
123 2021年10月28日
123 2023年10月30日
85 2021年8月1日 PR
85 2021年6月15日 PR M
85 2021年8月22日 M PR
11 2021年6月25日
122 2021年7月22日 公共关系
444 2022年5月18日

您可能只需要记住它从PR移动的最后一个日期。您需要处理ID的所有记录来计算标志值
您可以为此使用DOW循环。

data want;
do until (last.id);
set have;
by id dt;
if (before='PR' and after in ('M' 'P')) then from_dt=dt;
if after='PR' and intnx('month',dt,-4,'s') <= from_dt then from_dt=.;
if not missing(from_dt) then do;
if dt > intnx('month',from_dt,4,'s') then flag=1;
end;
end;
flag=sum(flag,0);
format from_dt date9.;
keep id flag;
run;

如果您想将其合并回详细记录中,请使用双DOW循环,其中第二个循环只是重新读取观测值,以便使用FLAG变量集写出观测值。

data want;
do until (last.id);
set have;
by id dt;
if (before='PR' and after in ('M' 'P')) then from_dt=dt;
if after='PR' and intnx('month',dt,-4,'s') <= from_dt then from_dt=.;
if not missing(from_dt) then do;
if dt > intnx('month',from_dt,4,'s') then flag=1;
end;
end;
flag=sum(flag,0);
do until (last.id);
set have;
by id ;
output;
end;
format from_dt date9.;
drop from_dt;
run;

结果

Obs     ID           DT    BEFORE    AFTER      from_dt    flag
1      11    25JUN2021      P        P               .      0
2      85    01AUG2021      PR       PR              .      0
3      85    15AUG2021      PR       M               .      0
4      85    22AUG2021      M        PR              .      0
5     122    22JUL2021      PR       PR              .      0
6     123    21MAY2021      PR       P       21MAY2021      1
7     123    28OCT2021      P        P       21MAY2021      1
8     123    30OCT2023      P        P       21MAY2021      1

相关内容

  • 没有找到相关文章

最新更新