如果您有这样的示例数据:
data input;
infile datalines;
length product $10 period value 8;
informat period yymmdd10.;
format period yymmdd10.;
input product $ period value;
datalines;
car 2016-01-01 10
car 2015-12-01 20
car 2015-11-01 30
car 2015-10-01 40
car 2015-09-01 30
car 2015-08-01 15
;
run;
您可以使用条件左连接输入表本身:
input t1 left join input t2
on t1.product = t2.product
and t2.period between intnx('month',t1.period,-2,'b') and t1.period
group by t1.product, t1.period, t1.value
有了这个你有t1.value作为当前值和avg(t2.value)作为3个月的平均值。要使用ifn() 函数计算 2 个月的平均值,将比上一个时期更早的每个值更改为缺失值:
avg(ifn( t2.period >= intnx('month',t1.period,-1,'b'),t2.value,. ))
完整代码如下所示:
proc sql;
create table want as
select t1.product, t1.period, t1.value as currentValue,
ifn(count(t2.period)>1,avg(ifn( t2.period >= intnx('month',t1.period,-1,'b'),t2.value,. )),.) as twoMonthsAVG,
ifn(count(t2.period)>2,avg(t2.value),.) as threeMonthsAVG
from input t1 left join input t2
on t1.product = t2.product
and t2.period between intnx('month',t1.period,-2,'b') and t1.period
group by t1.product, t1.period, t1.value
;
quit;
如果我没有足够的记录来计算度量,我还添加了count(t2.perion) 条件以返回缺失值。我的结果集如下所示: