It is definitely a very good homework assignment for every SAS programmer to work out, and I strongly recommend to put this one on the top of this list. In our daily work, we have a lot of tasks similar to this one, so surely I have worked out my way to do it. I will hold my program for a few days and let people to work it out from scratch.
[code:9e624]DATA SSS(KEEP=ID DATE VOL) TTT(KEEP=END_DATE) TT(KEEP=DATE);
SET TEM END=LAST;
END_ID=LAG(ID);
END_DATE=LAG(DATE);
END_VOL=LAG(VOL);
IF ID=END_ID AND VOL=LAG(VOL) THEN DELETE;
ELSE OUTPUT SSS TTT;
IF LAST THEN OUTPUT TT;
DATA TTT;
SET TTT(FIRSTOBS=2) TT(RENAME=(DATE=END_DATE));
DATA RESULT;
MERGE SSS TTT;
RUN;
[/code:9e624]
data tem(keep=id sdate edate vol);
retain id '' sdate edate vol 0;
set tem; by id vol date;
if first.vol then sdate=date;
if last.vol then do;
edate=date;output;
end;
format sdate edate yymmdd10.;
run;
proc sort data=tem;
by id vol;
run;
proc sql;
create table aa as select id, vol as new_vol, min(date) as sdate, max(date) as edate from tem
group by id, vol;
我不知道怎么把min(date)代表的天数转换为日期,只好用个笨办法
data final;
set aa;
format sdate:yymmdd10. edate:yymmdd10.;
run;
刚才那个用了LAG,在给个用DIF的
[code:7a981]
DATA SSS(KEEP=ID DATE VOL) TTT(KEEP=END_DATE) TT(KEEP=DATE);
SET TEM END=LAST;
RL=DIF(ID)+DIF(VOL);
END_DATE=LAG(DATE);
IF RL=0 THEN DELETE;
ELSE OUTPUT SSS TTT;
IF LAST THEN OUTPUT TT;
DATA TTT;
SET TTT(FIRSTOBS=2) TT(RENAME=(DATE=END_DATE));
DATA RESULT;
MERGE SSS TTT;
RUN;
[/code:7a981]
以下是我的程序,如果有问题或建议,请及时回复。
[code:09378]
proc sort data=tem;by id date;run;
data result;
retain id sdate edate new_vol;
format sdate yymmdd10. edate yymmdd10.;
set tem;
by id;
lag_vol=lag(vol);
lag_date=lag(date);
if first.id then call symput('sdate',date);
else do;
if lag_vol^=vol then do;
sdate=resolve('&sdate');
edate=lag_date;
new_vol=lag_vol;
output;
call symput('sdate',date);
end;
end;
if last.id then do;
sdate=resolve('&sdate');
edate=date;
new_vol=vol;
output;
end;