2011-01-13 40 views
2

我有一個數據集,如下所示,我需要檢索兩件事:1)每個日期的(date-1)和(date-3)之間的VALUE總和2)無論在5天內,VALUE是否爲> =兩天。我認爲應該使用PROC SQL,但我不確定如何實現這一點。 輸入數據集:檢索每個日期前n天的值

ID DATE  VALUE 
1 20110101  0 
1 20110102  0 
1 20110103  1 
1 20110104  2 
2 20110101  1 
2 20110102  2 
2 20110103  3 
2 20110104  4 

輸出應爲1)1(0 + 0 + 1)爲ID1,20110104和6(1 + 2 + 3)爲ID2,20110104.和2)標記爲ID1, 20110104,因爲在3天窗口期間有2天值爲0。

任何幫助,非常感謝!

回答

2

這兩個問題都可以用類似的SQL查詢來解決。你的第二個問題有點令人困惑,因爲你曾經提到過5天的週期和3天的窗口。我對這兩個查詢使用了相同的3天窗口,因此如果您需要另一個窗口,請修改開始日期和結束日期。

1)

proc sql; 
select t1.id, t1.date, sum(t2.value) as totalvalue 
from _input t1 
left join _input t2 
on t1.date-4 lt t2.date 
and t1.date gt t2.date 
and t1.id = t2.id 
group by t1.id, t1.date; 
quit; 

2)

proc sql; 
select t1.id, t1.date 
from _input t1 
left join _input t2 
on t1.date-4 lt t2.date 
and t1.date gt t2.date 
and t1.id = t2.id 
and t2.value = 0 
group by t1.id, t1.date 
having count(*) ge 2 
; 
quit; 
1

下面是隻使用一個數據步驟的另一種方法。我假設你不想在小於三條記錄的範圍內求和和標記,所以數據步驟明確地將它們設置爲undefined。

proc sort data=sample; 
    by id date; 
run; 

data result(drop=k count); 
    retain count; 
    set sample; 
    by id; 

    if first.id then count=0; 
    sum=lag1(value) + lag2(value) + lag3(value); 
    if count<3 then sum=.; 

    k=0; 
    if lag1(value)=0 then k=k+1; 
    if lag2(value)=0 then k=k+1; 
    if lag3(value)=0 then k=k+1; 
    if k ge 2 then mark=1; 

    count=count+1; 

run; 

proc print data=result; 
run; 
+0

我自己並不是那個滯後函數的狂熱粉絲。我覺得使用它太冒險了,因爲它很難排除錯誤(例如,如果你在if語句中意外使用它)。我個人堅持使用retain語句並手動執行。我發現更容易排除故障。 – 2011-01-13 23:37:32