创建示例dataset。
data test;
infile datalines;
input Cust_ID : $10.
Eff_YM : 8.
Trm_YM : 8.
;
datalines;
NH000001 201308 201408
NH000001 201308 201312
;
run;
从dataset 中选择minimum 和maximum 句点。不同的间隔将有尽可能多的不同datasets。
proc sql noprint;
select min(Eff_YM) into: min_Eff_YM from test;
select max(Trm_YM) into: max_Trm_YM from test;
quit;
由于我们需要在data 语句中预先指定datasets 的名称,所以在这里创建名称列表。
data dataset_names(keep=period dataset_name);
length dataset_name $20.;
format min_date date9. max_date date9.;
min_date=mdy((substr(compress(&min_Eff_YM.),5,2)),1,(substr(compress(&min_Eff_YM.),1,4)));
max_date=mdy((substr(compress(&max_Trm_YM.),5,2)),1,(substr(compress(&max_Trm_YM.),1,4)));
no_of_months=intck('month',min_date,max_date);
do i=0 to no_of_months;
period=put(intnx('month',min_date,i),yymmn6.);
dataset_name=compress(cat("dataset_",period));
output;
end;
run;
proc sql noprint;
select dataset_name into :all_datsets separated by " " from dataset_names;
select count(dataset_name) into :num_datasets from dataset_names;
select period into: all_periods separated by "," from dataset_names;
quit;
使用Eff_YM 和Trm_YM 之间的间隔创建可能记录的列表
%macro chk(YYMM);
data test_all;
set test;
No_of_loop=intck('month',
mdy((substr(compress(Eff_YM),5,2)),1,(substr(compress(Eff_YM),1,4))),
mdy((substr(compress(Trm_YM),5,2)),1,(substr(compress(Trm_YM),1,4))));
do i=0 to No_of_loop;
YearMonth = put(intnx('month',mdy((substr(compress(Eff_YM),5,2)),1,(substr(compress(Eff_YM),1,4))),i),yymmn6.);
output;
end;
run;
%mend;
%chk;
根据时期名称将数据集划分为单独的数据集
%macro data_dates;
data &all_datsets.;
set test_all;
%do i=1 %to &num_datasets.;
if YearMonth=scan("&all_periods.",&i.,",") then do;
output dataset_%sysfunc(scan("&all_periods.",&i.,","));
end;
%end;
run;
%mend;
%data_dates;