%macro aocflag (inds=, outds=, flagvar=, sort=, cond=); data &inds.sub1 &inds.sub2; set &inds; if &cond then output &inds.sub1; else output &inds.sub2; run; proc sort data=&inds.sub1; by &sort; run; data &inds.sub1; set &inds.sub1; by &sort; if first.usubjid then &flagvar= 'Y'; run; data &outds; set &inds.sub1 &inds.sub2; run; %mend aocflag; *** First USUBJID *****; %aocflag (inds=cm6, outds=cm7, flagvar=aocc01fl, sort=STUDYID USUBJID ATCTEXT1 ATCTEXT3 CMDECOD CMSEQ, cond=%str(prefl='Y') ); *** First ATCTEXT1 within usubjid *****; %aocflag (inds=cm7, outds=cm8, flagvar=aocc02fl, sort=STUDYID ATCTEXT1 USUBJID ATCTEXT3 CMDECOD CMSEQ, cond=%str(prefl='Y') ); *** First ATCTEXT3 within usubjid atctext1 *****; %aocflag (inds=cm8, outds=cm9, flagvar=aocc03fl, sort=STUDYID ATCTEXT1 ATCTEXT3 USUBJID CMDECOD CMSEQ, cond=%str(prefl='Y') ); *** First CMDECOD within usubjid atctext1 atctext3 *****; %aocflag (inds=cm9, outds=cm10, flagvar=aocc04fl, sort=STUDYID ATCTEXT1 ATCTEXT3 CMDECOD USUBJID CMSEQ, cond=%str(prefl='Y') );