2011-01-13 11 views
2

データセットは次のとおりです.1)各日付の(日付-1)と(日付-3)の間のVALUEの合計と2) 5日以内にVALUEが0より大きい2日以上あるかどうかを確認します。私は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 

出力は、ID1、ID2、20110104.及び2)のための20110104及び6(1 + 2 + 3)ID1用のマークのため1)1(0 + 0 + 1)であるべきです20110104、3日間のウィンドウ中に0の値で2日があるためです。

ご協力いただきありがとうございます。

答えて

2

どちらの問題も同様のSQLクエリで解決できます。 2度目の質問は少し混乱します。なぜならあなたは一度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

ここでだけデータステップを使用する代替方法です。私は、データ・ステップが明示的にそれらを未定義に設定するように、3レコード未満の範囲に対して合計とマークを必要としないと仮定しています。

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ステートメントを使用して手動で行うことに固執します。トラブルシューティングをはるかに簡単に行うことができます。 –

関連する問題