這應該可以做到。您需要使用通過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;
這並不完全清楚你要求什麼。另外,舉一個預期結果的例子。最重要的是,告訴我們你已經嘗試了什麼。 – PiotrWolkowski
對不起,這很難解釋。在我發佈的示例數據中,對於ref'11',我需要根據Date1和Time爲每個Date2求和最近的值(最大值爲3)。即,對於'11',我需要總結(345 + 322 + 6456)和(34 + 33)給我兩條記錄11:7123和11:67。 – jan8p