no comments but hope it is clear enough.
proc sort data = rawdata;
by id operate_time type ;
data good (drop = lag_type type rename = (operate_time = end_time)) need_work1 need_work2;
format start_time datetime.;
set rawdata ;
by id operate_time type;
lag_type = lag(type);
start_time = lag(operate_time);
if first.id then do;
lag_type = '';
start_time = .;
end;
if lag_type = '01' and type = '02' then do;
format stay time.;
stay = (operate_time - start_time) ;
output good;
end;
else if (first.id and type = '02')
or (type = lag_type) then output need_work1;
else if (last.id and type = '01') then output need_work2;
run;
data done_work (keep = id start_time end_time notes);
set need_work1(in = a) need_work2 (in = b);
by id operate_time type;
format notes $ 20. end_time datetime.;
if lag_type in ( '', '02') and type = '02' then do;
notes = 'Missing Start Time';
end_time = operate_time;
start_time = .;
end;
else if lag_type = '01' and type = '01' then do;
notes = 'Missing End Time';
end;
if b then do;
notes = 'Non Closed Session';
start_time = operate_time;
end;
run;
proc sort data = done_work;
by id start_time;
data final;
set good (in = g) done_work;
by id start_time;
if g then notes = 'Good Data';
run;