I created dataa and datab datasets changing 31JUN2014 to 30JUN2014. The only problem I had was with ID 235. Your 'want' says 235 should be gold. My results say it should be SILVER. I arbitrarily gave days the value of 1000000 when it would calculate as missing. proc sql; drop table testit; create table testit as select distinct a. ID, a.date format=date9., case when b.id = ' ' then . else b.date2 end as date2 format=date9., case when b.id = ' ' then ' ' else b.membership end as MEMBERSHIP, case when b.id = ' ' then 1000000 else a.DATE-b.DATE2 end as days , abs(calculated days) as absdays , min(calculated absdays)as close from DataA as a full join DataB as b on a.ID=b.ID group by a.ID, a.date order by id, close, date, absdays, date2 ; quit; proc sort data=testit; by id date close absdays; run; data testit3; set testit; by id date close absdays; if first.date then output; else delete; keep id date date2 membership; run; proc print data=testit3;run; ID DATE date2 MEMBERSHIP days absdays close 235 31MAR2014 28FEB2014 SILVER 31 31 31 235 31MAR2014 31MAY2014 GOLD -61 61 31 Obs ID DATE date2 MEMBERSHIP 1 123 31JAN2014 28FEB2014 PURPLE 2 123 31JUL2014 31JUL2014 SILVER 3 123 31AUG2014 31JUL2014 SILVER 4 222 31MAR2014 31MAR2014 BRONZE 5 222 30APR2014 31MAR2014 BRONZE 6 235 31MAR2014 28FEB2014 SILVER 7 333 30JUN2014 . 8 421 28FEB2014 . 9 991 31MAY2014 . 10 991 31OCT2014 . 11 991 31DEC2014 .
... View more