2014-06-25 136 views
0

我有一個課程項目數據,並且正在計算過去30天內每筆交易到此交易所花費的平均金額。平均每筆交易花費在此交易上的每月交易

例如,我在2014年6月24日發生了一筆交易,我希望在此交易之前查找過去30天內的賬戶總花費(24月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; 

我還沒有機會測試它,但這是我的想法,非常感謝你!

+4

當然有辦法做到這一點,但你應該先向我們展示你自己到底是什麼,以便你可以從那裏引導。堆棧溢出不是按需服務的代碼;我們會幫助您處理您的代碼,而不是爲您寫信。請閱讀[幫助],[mcve](http://stackoverflow.com/help/mcve) – indivisible

+0

如果您即將使用,請不要將代碼粘貼到評論部分,只需使用新信息編輯原始問題即可。 (並記住在所有行之前加上4個空格或突出顯示粘貼的代碼並點擊格式化按鈕) – indivisible

回答

0

所以有很多不同的方式可以處理這個問題,但我喜歡你要使用proc SQL的地方。我認爲連接比「存在」更容易閱讀,所以這就是我在示例中使用的。

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用戶審覈)。

希望這會有所幫助!

+0

嗨,Acie,非常感謝你的幫助,它完美的工作! – JImmy