在此交易之前的一个月内每笔交易平均花费的金额

时间:2014-06-25 03:03:03

标签: sql sas aggregate proc

我有一个班级项目数据,我正在计算每笔交易直到此交易过去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;

我还没有机会测试它,但这是我的想法,非常感谢!!

1 个答案:

答案 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用户审核)。

希望这有帮助!