Hash fun:
data have;
input EndOfMonth_Reporting :date9. USERID LoginMDY90 :date9.;
format EndOfMonth_Reporting LoginMDY90 date9.;
cards;
31-Oct-17 976 23-Oct-17
30-Nov-17 976 1-Nov-17
30-Nov-17 976 5-Nov-17
30-Nov-17 976 8-Nov-17
30-Nov-17 976 10-Nov-17
30-Nov-17 976 12-Nov-17
30-Nov-17 976 16-Nov-17
30-Nov-17 976 17-Nov-17
30-Nov-17 976 19-Nov-17
30-Nov-17 976 21-Nov-17
30-Nov-17 976 29-Nov-17
30-Nov-17 976 30-Nov-17
31-Dec-17 976 4-Dec-17
31-Dec-17 976 7-Dec-17
31-Dec-17 976 9-Dec-17
31-Dec-17 976 11-Dec-17
31-Dec-17 976 15-Dec-17
31-Dec-17 976 19-Dec-17
31-Dec-17 976 21-Dec-17
31-Dec-17 976 22-Dec-17
31-Jan-18 976 1-Jan-18
31-Jan-18 976 2-Jan-18
31-Jan-18 976 4-Jan-18
31-Jan-18 976 9-Jan-18
31-Jan-18 976 10-Jan-18
31-Jan-18 976 16-Jan-18
31-Jan-18 976 19-Jan-18
31-Jan-18 976 23-Jan-18
31-Jan-18 976 25-Jan-18
31-Jan-18 976 29-Jan-18
28-Feb-18 976 1-Feb-18
28-Feb-18 976 2-Feb-18
28-Feb-18 976 5-Feb-18
28-Feb-18 976 12-Feb-18
28-Feb-18 976 15-Feb-18
;
data want ;
if _n_=1 then do;
if 0 then set have;
dcl hash H (dataset:'have(drop=EndOfMonth_Reporting)',ordered: "A",multidata:'y') ;
h.definekey ("userid") ;
h.definedata ("LoginMDY90") ;
h.definedone () ;
end;
do CountLoginMD=1 by 1 until(last.EndOfMonth_Reporting);
set have(drop=LoginMDY90);
by userid EndOfMonth_Reporting;
if last.EndOfMonth_Reporting then
do rc=h.find() by 0 while(rc=0);
CountLoginMDY90=sum(CountLoginMDY90,intnx('days',EndOfMonth_Reporting,-90)<=LoginMDY90<=EndOfMonth_Reporting );
rc=h.find_next();
end;
end;
keep userid EndOfMonth_Reporting CountLoginMD CountLoginMDY90;
run;
... View more