|
|
5#

楼主 |
发表于 2009-7-8 23:51:01
|
只看该作者
Re: 求助:一个折磨了我很久的问题
不知道效率如何?还有更好的方法吗?
[code:bmlg1jmx]/* 设定滞后量 */
%let lag_n=10;
/* 创建模拟数据 */
data raw_data;
do code=1 to 100;
do date='01jan09'd to '30jan09'd;
p=ceil(10*ranuni(123));
output;
end;
end;
format date yymmdd10.;
run;
/* 拷贝模拟数据 */
data copy_data;
set raw_data;
rename code=copy_code
date=copy_date
p=copy_p
;
run;
/* 使用HASH ITERATOR创建中间变量 */
data temp_data(drop=copy_code copy_date copy_p rc);
if _n_=1 then
do;
declare hash p_hash(dataset:'copy_data',hashexp:10,ordered:'ascending');
p_hash.definekey ('copy_code','copy_date');
p_hash.definedata('copy_code','copy_date','copy_p');
p_hash.definedone();
call missing(copy_code,copy_date,copy_p);
declare hiter p_hiter('p_hash');
end;
set raw_data;
length temp $500;
flag=0;
rc=p_hiter.first();
do while(rc eq 0);
if (code=copy_code) and (0<=date-copy_date<&lag_n) then
do;
if flag=0 then temp=cat(copy_p);
else temp=catx(',',temp,copy_p);
flag+1;
end;
rc=p_hiter.next();
end;
run;
/* 创建宏 */
%macro compute;
%let dsid=%sysfunc(open(temp_data));
%let nobs=%sysfunc(attrn(&dsid,nobs));
%syscall set(dsid);
%do i=1 %to &nobs;
%let rc=%sysfunc(fetchobs(&dsid,&i));
code=&code;
date=&date;
p=&p;
%if &flag=&lag_n %then %do;
cmp=max(&temp)-min(&temp);
dh=median(&temp);
%end;
output;
%end;
%let dsid=%sysfunc(close(&dsid));
%mend;
/* 调用宏 */
data final_data;
%compute
format date yymmdd10.;
run;[/code:bmlg1jmx] |
|