Here is another solution, using proc sql: data have; input @1 trans_year @7 trans_date :yymmdd8. @17 name $30.; format trans_date yymmdd10.; datalines; 2004 20041108 BOWEN KEVIN C 2007 20070618 BOWEN KEVIN C 2007 20070919 BOWEN KEVIN C 2007 20071116 BOWEN KEVIN C 2007 20071121 BOWEN KEVIN C 2007 20071126 BOWEN KEVIN C 2008 20081129 BOWEN KEVIN C ; proc sql; create table mix as select a.name ,a.trans_date ,a.trans_year ,b.trans_date as prev_trans_date ,case b.trans_date when . then 0 else 1 end as cnt from have a left join have b on (a.name = b.name and (b.trans_year < a.trans_year and a.trans_year - b.trans_year <= 3) or b.trans_date = .) order by a.name, a.trans_date, b.trans_date ; create table want as select name ,trans_date ,sum(cnt) as cnt_trans from mix group by name, trans_date ; quit;
... View more