data A;
infile datalines;
input Subjid $ Start_date ddmmyy10.;
format start_date e8601da.;
datalines;
Subj1 01/01/2001
Subj2 02/02/2002
Subj3 03/03/2003
Subj4 04/04/2004
;
run;
data B;
infile datalines;
input Subjid $ end_date ddmmyy10.;
format end_date e8601da.;
datalines;
Subj1 01/01/2021
Subj2 02/02/2022
Subj3 03/03/2023
Subj4 04/04/2024
;
run;
Data C;
infile datalines;
input Subjid $ lab_date ddmmyy10.;
format lab_date e8601da.;
datalines;
Subj1 01/01/1999
Subj2 02/02/2001
Subj3 03/03/2001
Subj4 04/04/2025
;
run;
data D;
infile datalines;
input Subjid $ Test_date ddmmyy10.;
format test_date e8601da.;
datalines;
Subj1 01/01/2011
Subj2 02/02/2011
Subj3 03/03/2025
Subj4 04/04/2014
;
run;
proc sql;
create table a_b as
select a.*
,b.end_date
from a natural join b;
quit;
options mprint;
%macro checkForViolation(datasets=C#D,dates=lab_date#test_date);
%local i;
%do i=1 %to %sysfunc(countw(&datasets, #));
proc sql;
create table %scan(&datasets, &i, #)_violate as
select l.*
from %scan(&datasets, &i, #) as l left join a_b as r
on l.subjid=r.subjid
where l.%scan(&dates, &i, #) < r.start_date or l.%scan(&dates, &i, #) > r.end_date;
quit;
%end;
%mend checkForViolation;
%checkForViolation;
Is this what you mean
... View more