2014-07-03 63 views
2

我有一個非常大的SAS數據集,其中包含我想根據多個字段總結前三條記錄的記錄。根據SAS中的多個字段選擇前3個觀察值?

的數據的一個例子:

Data Image

假設數據被正確排序,即,通過參考排序,日期1(降序),時間(降序),日期2(商品說明)。數據集中不存在「總和」字段(請參見下文)。

對於每個Date2的實例,使用SAS,我需要對每個ref的前3個最新值(基於Date1 &時間)進行求和。在示例數據中,「總和」字段是數據如何求和的總和,即將所有1加起來,將2加起來,等等。

道歉對於糟糕的解釋,我一直在嘗試這樣做幾天無濟於事!

非常感謝。

+0

這並不完全清楚你要求什麼。另外,舉一個預期結果的例子。最重要的是,告訴我們你已經嘗試了什麼。 – PiotrWolkowski

+0

對不起,這很難解釋。在我發佈的示例數據中,對於ref'11',我需要根據Date1和Time爲每個Date2求和最近的值(最大值爲3)。即,對於'11',我需要總結(345 + 322 + 6456)和(34 + 33)給我兩條記錄11:7123和11:67。 – jan8p

回答

0

這應該可以做到。您需要使用通過by語句啓用的按組處理。然後,您可以使用first.last.表示法來了解您何時到達每個組的開始或結束時間。 retain聲明告訴sas哪些變量應該記住它們在整個觀察值中的值。

樣本數據:

data tmp; 
    informat date1 date2 ddmmyy10.; 
    input ref 
     date1 
     date2 
     time 
     value 
     ; 
datalines; 
11 03/01/2014 01/01/2014 9 345 
11 03/01/2014 01/01/2014 8 322 
11 03/01/2014 01/01/2014 7 6546 
11 01/01/2014 31/12/2013 6 34 
11 01/01/2014 31/12/2013 5 33 
22 02/01/2014 01/01/2014 4 234 
22 02/01/2014 01/01/2014 3 66 
22 01/01/2014 01/01/2014 2 234 
33 01/01/2014 01/01/2014 1 2 
33 01/01/2014 31/12/2014 0 45 
; 
run; 

然後確保數據正確排序,所以我們可以使用組處理:

proc sort data=tmp; 
    by ref date1 date2 descending time; 
run; 

因爲sum()語句只累計求和值,當計數器是< = 3您將得到每個組的前3個值的總和。當該組結束時,將輸出一條記錄。

data tmp2; 
    set tmp; 
    by ref date1 date2; 
    retain counter total .; 

    if first.date2 then do; 
    total = 0; 
    counter = 1; 
    end; 

    if counter le 3 then do; 
    total = sum(total,value); 
    end; 

    if last.ref or last.date1 or last.date2 then do; 
    output; 
    end; 

    counter = counter+1; 

run; 
相關問題