If your data are already group by patient_id, then a two dimensional array (rows for medication, columns for dates) provides a neat way to record each medication history, and then search each date for 3 or more meds:
data have;
input Patient_ID $ Medication $ start_dt :mmddyy10. End_dt :mmddyy10.;
format start_dt end_dt mmddyy10.;
datalines;
Tom A 8/29/2013 9/28/2013
Tom A 10/3/2013 11/2/2013
Tom A 11/4/2013 12/4/2013
Tom A 12/7/2013 1/6/2014
Tom A 1/22/2014 8/26/2014
Tom B 8/29/2013 9/28/2013
Tom B 10/1/2013 11/25/2013
Tom B 12/7/2013 1/6/2014
Tom B 1/12/2014 2/11/2014
Tom B 2/16/2014 3/18/2014
Tom B 3/30/2014 4/29/2014
Tom B 5/13/2014 7/7/2014
Tom E 9/6/2013 11/2/2013
Tom E 2/7/2014 2/14/2014
Jerry C 8/5/2013 12/27/2013
Jerry C 1/2/2014 5/23/2014
Jerry C 5/29/2014 7/27/2014
Jerry D 3/21/2014 6/14/2014
Jerry D 6/16/2014 8/8/2014
Jerry E 6/7/2014 6/19/2014
Joe A 3/28/2016 5/27/2016
Joe A 6/2/2016 7/28/2016
Joe A 8/3/2016 9/2/2016
Joe A 9/7/2016 11/5/2016
Joe A 11/7/2016 12/7/2016
Joe A 12/12/2016 1/11/2017
Joe A 1/13/2017 2/12/2017
Joe A 2/15/2017 4/15/2017
Joe C 7/25/2016 8/24/2016
Joe C 8/26/2016 9/25/2016
Joe C 10/10/2016 12/7/2016
Joe C 12/12/2016 1/11/2017
Joe C 1/20/2017 3/22/2017
Joe D 3/28/2016 5/28/2016
Joe D 6/6/2016 11/5/2016
Joe D 11/7/2016 12/7/2016
Joe D 12/12/2016 4/22/2017
Joe E 5/12/2016 5/15/2016
Mary D 12/12/2016 4/22/2017
Mary A 5/12/2016 5/15/2016
;
%let mindate9=01jan2013;
%let maxdate9=31dec2017;
data want (keep=patient_id flag3_meds);
set have;
by patient_id notsorted;
array drg_dates{1:5,%sysevalf("&mindate9"d):%sysevalf("&maxdate9"d)} _temporary_;
retain min_date max_date;
if first.patient_id then call missing(of drg_dates{*},min_date,max_date);
row=indexc('ABCDE',medication);
min_date=min(min_date,start_dt);
max_date=max(max_date,end_dt);
do col=start_dt to end_dt;
drg_dates{row,col}=1;
end;
if last.patient_id;
flag3_meds=0;
do date=min_date to max_date until(flag3_meds=1);
flag3_meds=sum(0,drg_dates{1,date},drg_dates{2,date},drg_dates{3,date},drg_dates{4,date},drg_dates{5,date}) >=3;
end;
run;
Make sure to set the macrovars MINDATE9 and MAXDATE9 to cover the entire date range for your study.
... View more