我正在尝试查看日期列表,并仅保留5次或更多次出现日期的日期范围,并删除所有其他日期。我的例子是:
data test;
input dt dt2;
format dt dt2 date9.;
datalines;
20000 20001
20000 20002
20000 20003
21000 21001
21000 21002
21000 21003
21000 21004
21000 21005
;
run;
proc sort data = test;
by dt dt2;
run;
data check;
set test;
by dt dt2;
format dt dt2 date9.;
if last.dt = first.dt then
if abs(last.dt2 - first.dt) < 5 then delete;
run;
如果可能的话,我想要归还的只是一个条目,但我也会对整个适当的范围感到满意。 一个条目是一个包含以下内容的表:
start_dt end_dt
21000 21005
适当的范围是:
21000 21001
21000 21002
21000 21003
21000 21004
21000 21005
我的代码无法按预期运行,我不确定需要做出哪些更改。
答案 0 :(得分:4)
last.dt2
和first.dt
是标志,可以在(0,1)中有值,因此条件abs(last.dt2 - first.dt) < 5
始终为true。
使用计数器变量来计算组中的记录:
data check(drop= count);
length count 8;
count=0;
do until(last.dt);
set test;
by dt dt2;
format dt dt2 date9.;
count = count+1;
if last.dt and count>=5 then output;
end;
run;
答案 1 :(得分:0)
我不确定你为什么要在你的删除功能中使用last.dt2和first.dt,所以我把它转过来创建你想要的输出:
data check2;
set test;
by dt ;
format dt dt2 date9.;
if last.dt then do;
if abs(dt2 - dt) >= 5 then output;
end;
run;
当然,只有在dt和dt2上对文件进行排序时,这才有效。
希望这有帮助。