The MEANS will calculate the statistics properly, you just need to fix the SQL so that it includes the values that you want to include in your calculations. It seems dubious to me to group by RET and also include RET in the returned values? Perhaps you want to group by H2.RET (so you can still see the actual value for that date) and also include H1.RET as another variable so that it cab be fed into PROC MEANS. A small example of what you want would help (perhaps with 3 or 5 instead of 24 months so that the number of records is smaller). data have ; do cusip=1,2 ; rec+1; baseDate = '01JAN2000'd ; do month=0 to 26 ; monthDate = intnx('month',baseDate,month); ret = ranuni(0); output; end; end; run; proc sql ; create view roll24 as select h2.cusip , h2.monthDate as periodEndDate format=yymmd7. , h2.ret , h1.ret as lagret from have as h1 , have as h2 where h1.cusip=h2.cusip and intck("MONTH", h1.monthDate, h2.monthDate) between 1 and 24 group by h2.cusip, h2.monthDate, h2.ret having count(h2.cusip)=24 ; quit; proc means data=roll24 noprint ; by cusip periodenddate ret ; var lagret ; output out=roll mean=meanRet std=stdRet skew=skewRet ; run; proc print data=roll ; run; period Obs cusip EndDate ret _TYPE_ _FREQ_ meanRet stdRet skewRet 1 1 2002-01 0.22396 0 24 0.50622 0.29944 -0.26692 2 1 2002-02 0.23832 0 24 0.51477 0.28762 -0.21262 3 1 2002-03 0.64083 0 24 0.49023 0.28492 -0.04201 4 2 2002-01 0.59923 0 24 0.52899 0.28713 0.13578 5 2 2002-02 0.91479 0 24 0.52256 0.28359 0.19230 6 2 2002-03 0.41203 0 24 0.52664 0.28867 0.20478
... View more