/* Direct Access Merge Method */
%macro damerge(src_ds =, /* NAME OF SOURCE DATASET (E.G. LAB) */
mrg_ds =, /* NAME OF TARGET DATASET (E.G. */
/* DRUG) */
wrk_ds =, /* NAME OF TEMPORARY DATASET (E.G. */
/* TEMP) */
criteria =, /* SELECTION CRITERIA AS A FULL */
/* IF .. THEN STATEMENT (E.G. IF */
/* LABDATE GE START AND LABDATE LE */
/* STOP THEN) */
src_sort =, /* SORT ORDER OF SOURCE DATASET */
/* (E.G. PATID LABDATE) */
com_sort =, /* SORT ORDER OF VARIABLE COMMON TO */
/* BOTH (E.G. PATID) */
breakby =); /* BREAK VARIABLE IN THE SORT ORDER */
/* (E.G. PATID) */
/* SORT EACH DATA SET BY THE APPROPRIATE KEY VARIABLES. */
proc sort data=&src_ds;
by &src_sort;
proc sort data=&mrg_ds;
by &com_sort;
/* DETERMINE THE FIRST AND LAST POINTER IN THE TARGET DATA */
/* SET FOR EACH KEY BREAK GROUP. */
data &wrk_ds (keep=&com_sort tempibeg tempiend);
set &mrg_ds;
by &com_sort;
retain tempibeg 1 tempiend 0;
tempiend=tempiend+1;
if last.&breakby then do;
output;
tempibeg=tempiend+1;
end;
/* MERGE THOSE POINTERS INTO THE SOURCE DATA SET. */
data &src_ds;
merge &src_ds (in=a) &wrk_ds;
by &com_sort;
if a then output;
/* CREATE A DATA SET WITH 1 OBSERVATION WHOSE VARIABLES ARE */
/* THOSE IN THE MRG_DS BUT WHOSE VALUES ARE MISSING. THIS IS */
/* NEEDED TO FORCE THE ADDED VARIABLES TO BE MISSING WHEN NO */
/* MATCHES ARE FOUND. IF THIS STEP IS NOT TAKEN, THEN THE */
/* ADDED VARIABLES WOULD HAVE THE LAST READ VALUES IN MRG_DS, */
/* WHICH WOULD BE MEANINGLESS AND POTENTIALLY PROBLEMATIC */
/* TO THE CALLING PROGRAM. */
data &wrk_ds;
if _n_ eq 1 then output;
tempi=1;
set &mrg_ds(drop=&com_sort) point=tempi;
stop;
/* PROCESS THE SOURCE DATA SET BY EXAMINING EACH RECORD IN */
/* THE TARGET DATA SET THAT APPLIES TO THE CURRENT RECORD IN */
/* THE SOURCE DATA SET. OUTPUT THOSE THAT MATCH THE DESIRED */
/* CRITERIA. */
data &src_ds(drop=tempi tempibeg tempiend tempmat);
set &src_ds;
tempmat=0;
if tempibeg ne . then do;
do tempi=tempibeg to tempiend;
set &mrg_ds point=tempi;
&criteria
do;
tempmat=1;
output;
end;
end;
end;
if tempmat eq 0 then do;
tempi=1;
set &wrk_ds point=tempi;
output;
end;
%mend damerge;