Is this what you are looking for
DATA WORK.test;
LENGTH
ID $ 14
Move $ 12
Move_datetime 6.;
FORMAT
ID $CHAR14.
Move $CHAR12.
Move_datetime datetime18.;
INFORMAT
ID $CHAR14.
Move $CHAR12.
Move_datetime datetime18.;
INPUT
ID : $CHAR14.
Move : $CHAR12.
Move_datetime :datetime18.;
DATALINES4;
1 Admit 01JAN2019:12:00:00
1 Release 01JAN2019:12:01:00
1 Admit 15JAN2019:12:00:00
1 Release 17JAN2019:21:56:00
1 Admit 17JAN2019:21:57:00
1 Release 20JAN2019:08:05:00
1 Admit 01FEB2019:01:20:00
1 Release 15FEB2019:21:50:00
1 Admit 15FEB2019:21:50:00
1 Release 15FEB2019:21:50:00
;;;;
run;
proc sort; by ID Move_datetime; run;
data want;
set test nobs=obs;
call symputx ('nobs',obs);
stop;
run;
data want(keep= ID Admit_Date Release_Date);
set test;
by ID Move_datetime;
array Admit_date_array{&nobs} ;
array release_date_array{&nobs};
retain release_date_array: Admit_date_array: count 0;
if first.id then count=1;
if strip(Move)='Admit' then Admit_date_array[count] = Move_datetime;
if strip(Move)='Release' then do;
Release_date_array[count] = Move_datetime;
count=count+1;
end;
format Admit_date Release_date datetime18.;
if last.id then do;
Admit_date = Admit_date_array[1];
Release_date = Release_date_array[1];
do val = 1 to count-1;
if Admit_date_array[min(count,val+1)] - Release_date > 3600 then do;
Release_date = Release_date_array[Val];
output;
Admit_date = Admit_date_array[min(count-1,val+1)];
Release_date = Release_date_array[min(count-1,val)];
val=val+1;
put '*********************************************';
put _all_;
put '##############################################';
end;
else if val>=count-1 then do;
Release_date = Release_date_array[min(count-1,val)];
output;
end;
end;
end;
run;
... View more