我在SAS Enterprise Guide中有如下表格。表显示了客户的历史记录以及他对所使用服务的最终更改(列:BEFORE,AGAIN(。
ID和DT没有排序,但如果它是重要的,则可能是
列的数据类型:
- ID-数字
- DT-日期
- BEFORE-字符
- AFTER-字符
ID | DT | BEFORE | AFTER |
---|---|---|---|
123 | 2021年5月21日 | PR | P|
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日 | P||
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