我有一个班级项目数据,我正在计算每笔交易直到此交易过去30天的平均金额。
例如,我有一个交易发生在2014年6月24日,我想查找在此交易之前的过去30天(可能是24日至24日)与该帐户一起花费的总金额,并将其除以交易数量在这个时间框架内。我需要为每笔交易执行此操作。数据看起来像alltran:
obs tran_date tran_amt mechr_cate_cd
1 05/04/14 5.32 4633
2 05/06/14 8.97 5846
3 06/02/14 10.13 7996
我希望输出看起来像
obs tran_date tran_amt mechr_cate_cd avg_amt30
1 05/04/14 5.32 4633 5.32
2 05/06/14 8.97 5846 7.15
3 06/02/14 10.13 7996 8.14
我正在考虑在proc sql中使用相关子查询:
proc sql;
create table sub as
select tran_date tran_amt
from alltran;
run;
proc sql;
select * from alltran a
where exists
(select avg(tran_amt) as avg_amt30 from sub b
where a.tran_date-30<=b.tran_date<=a.tran_date);
run;
我还没有机会测试它,但这是我的想法,非常感谢!!
答案 0 :(得分:0)
所以有很多不同的方法可以解决这个问题,但我喜欢你在哪里使用proc SQL。我认为连接比#34;存在更容易阅读&#34;,这就是我在我的例子中使用的内容。
data alltran;
infile datalines ;
input obs tran_date tran_amt mechr_cate_cd;
informat tran_date mmddyy10.; format tran_date mmddyy10.;
datalines ;
1 05/04/14 5.32 4633
2 05/06/14 8.97 5846
3 06/02/14 10.13 7996
;
run;
proc sql;
create table alltran_duped as
Select a.* , b.tran_amt as Cumulative_tran_amt
from alltran a
left join alltran b
on b.tran_date <= a.tran_date <= b.tran_date + 30;
create table alltran2 as
select obs, tran_date, tran_amt, mechr_cate_cd, avg(Cumulative_tran_amt) as avg_amt30
from alltran_duped
group by obs, tran_date, tran_amt, mechr_cate_cd;
quit;
上面的proc sql步骤执行以下操作: 1)将数据连接回自身,其中来自连接表的tran_date距离原始记录30天或更少。如果前30天内有多个记录,则记录重复。
2)对原始的4列进行分组并获取在步骤1中加入的平均tran_amt值。这一切都可以一步完成,但我认为将其拆分会使代码更易于阅读。
还有其他方法可以解决这个问题,但我个人认为使用proc sql更简单,更容易检查(特别是如果您的代码由其他SQL用户审核)。
希望这有帮助!