Very interesting question.
If your data is not big , try this code:
p.s. using data is from Freelance.
data cases(rename=(d=duration_case) where=(age ne 21))
controls(rename=(d=duration_control) where=(age ne 42));
call streaminit(27182818);
do enrolid=1 to 4000;
age=rand('integer',18,80);
gender=char('MF',rand('integer',1,2));
d=rand('integer',1,2000);
if enrolid<1000 then output cases;
else output controls;
end;
run;
data want;
if _n_=1 then do;
if 0 then set controls(rename=(enrolid=control_enrolid age=control_age gender=control_gender));
declare hash h(dataset:'controls(rename=(enrolid=control_enrolid age=control_age gender=control_gender))',ordered:'y');
declare hiter hi('h');
h.definekey('control_enrolid','control_age','control_gender','duration_control');
h.definedata('control_enrolid','control_age','control_gender','duration_control');
h.definedone();
end;
set cases(rename=(enrolid=case_enrolid age=case_age gender=case_gender));
match='case '; enrolid=case_enrolid; age=case_age; gender=case_gender; duration=duration_case;
output;
rc=hi.first();
do while(rc=0);
if case_age=control_age and case_gender=control_gender and duration_case<duration_control then do;
match='control'; enrolid=control_enrolid; age=control_age; gender=control_gender; duration=duration_control;
output;
found=1;
leave;
end;
rc=hi.next();
end;
if found then do;
rc=hi.next();
rc=h.remove(key:enrolid,key:age,key:gender,key:duration);
end;
keep match enrolid age gender duration ;
run;
... View more