1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
data test;
input pid name $ (dt_start dt_end)(:date9.);
format dt_start dt_end :date9.;
cards;
1 drugA 22oct2015 08nov2015
1 drugA 09nov2015 16dec2015
1 drugB 25oct2015 04nov2015
1 drugB 06nov2016 .
2 drugA 10oct2015 10nov2015
2 drugA 11nov2015 12dec2015
2 drugB 02oct2015 08nov2015
2 drugB 07nov2016 .
; run;
data test1 test2 ;
set test;
do until (last.pid);
set test;
by pid;
if dt_start=. or dt_end=. then do;
pid1=pid;
name1=name;
end;
end;
do until (last.pid);
set test;
by pid;
if pid=pid1 and name=name1 then output test2;
else do;
output test1;
end;
end;
run;
proc sql;
create table test11 as select pid, name ,min(dt_start) as dt_start format =date9.,
max(dt_end) as dt_end format =date9. from test1
where dt_start ne . or dt_end ne .
group by pid , name;
quit;
data finale;
set test11 test2(drop=pid1 name1);
run; |
Partager