The following code returns for your sample data what you've asked for.
data want;
infile datalines truncover dsd;
input Person_ID $ Begin_Date :mmddyy10. End_Date :mmddyy10.;
format Begin_Date End_Date mmddyy10.;
datalines;
111111,7/14/2018,7/19/2018
111111,7/26/2018,7/30/2018
111111,11/17/2018,11/26/2018
222222,5/17/2018,5/19/2018
444444,12/21/2018,12/28/2018
555555,4/28/2018,5/3/2018
555555,5/6/2018,5/10/2018
555555,11/26/2018,11/29/2018
666666,1/14/2018,1/24/2018
666666,1/29/2018,1/31/2018
666666,2/4/2018,2/5/2018
666666,2/7/2018,2/12/2018
666666,8/18/2018,8/23/2018
666666,10/3/2018,10/16/2018
666666,11/4/2018,11/5/2018
666666,11/5/2018,11/12/2018
;
run;
data have;
infile datalines truncover dsd;
input Person_ID $ Begin_Date :mmddyy10. End_Date :mmddyy10. Eligible;
format Begin_Date End_Date date9.;
if _n_=1 then
do;
dcl hash h1(dataset:'want');
h1.defineKey('Person_ID', 'Begin_Date', 'End_Date');
h1.defineDone();
end;
want_flg= h1.check()=0;
datalines;
111111,3/13/2018,3/15/2018,0
111111,4/24/2018,4/26/2018,0
111111,7/13/2018,7/14/2018,0
111111,7/14/2018,7/19/2018,1
111111,7/26/2018,7/30/2018,1
111111,11/17/2018,11/26/2018,1
222222,5/1/2018,5/4/2018,0
222222,5/17/2018,5/19/2018,1
333333,3/8/2018,3/9/2018,0
333333,4/17/2018,4/26/2018,0
333333,6/16/2018,6/20/2018,0
333333,7/3/2018,7/4/2018,0
333333,7/23/2018,7/24/2018,0
333333,8/9/2018,8/10/2018,0
333333,9/8/2018,9/11/2018,1
333333,9/11/2018,9/14/2018,1
333333,9/23/2018,9/26/2018,0
444444,7/5/2018,7/7/2018,0
444444,12/21/2018,12/28/2018,1
555555,4/28/2018,5/3/2018,1
555555,5/6/2018,5/10/2018,1
555555,11/26/2018,11/29/2018,1
666666,1/14/2018,1/24/2018,1
666666,1/29/2018,1/31/2018,1
666666,2/4/2018,2/5/2018,1
666666,2/7/2018,2/12/2018,1
666666,8/18/2018,8/23/2018,1
666666,8/24/2018,8/25/2018,1
666666,8/28/2018,9/3/2018,1
666666,9/6/2018,9/11/2018,1
666666,9/13/2018,9/16/2018,1
666666,9/22/2018,9/23/2018,0
666666,10/3/2018,10/16/2018,1
666666,11/4/2018,11/5/2018,1
666666,11/5/2018,11/12/2018,1
666666,12/25/2018,12/28/2018,1
666666,12/30/2018,12/31/2018,0
;
run;
proc sort data=have;
by Person_ID descending Begin_Date;
run;
data derived;
set have;
by Person_ID descending Begin_Date;
length derived_flg check_date 8;
format check_date date9.;
retain check_date;
if first.person_id and Eligible=1 then check_date='31Dec5999'd;
else if Eligible=0 then check_date=Begin_Date;
if Eligible=0 then delete;
diff=check_date-Begin_Date;
derived_flg= check_date-Begin_Date>30;
run;
proc print data=derived;
run;
... View more