UserとID_optionでグループ分けされた最後の3時間の使用(データセット内のカラムの1つ)をすべての行で検索する必要があります。 すべての行(行)は1レコード(3分の時間間隔内)を表します。 (所望の列sum_usage_3hrを含む)、例えば:SASベース内の無効なDOループ制御情報
User ID_option time usage sum_usage_3hr
1 a1 12OCT2017:11:20:32 3 10
1 a1 12OCT2017:10:23:24 7 14
1 b1 12OCT2017:09:34:55 12 12
2 b1 12OCT2017:08:55:06 4 6
1 a1 12OCT2017:07:59:53 7 7
2 b1 12OCT2017:06:59:12 2 2
Iは、ハッシュテーブルについては、以下のコードを使用している:
data want;
if _n_=1 then do;
if 0 then set have(rename=(usage=_usage));
declare hash h(dataset:'have(rename=(usage=_usage))',hashexp:20);
h.definekey('user','id_option','time');
h.definedata('_usage');
h.definedone();
end;
set have;
sum_usage_3hr=0;
do i=time-3*3600 to time ;
if h.find(key:user,key:id_option,key:i)=0 then sum_usage_3hr+_usage;
end;
drop _usage i;
run;
しかし、私はエラー得た:INITIAL又は発現するか無効DOループ制御情報を、 BY式が欠落しているか、ゼロまたは無効です。私が追加した場合: 出力; end: 「実行」のすぐ上にあります。 'No DO/Select statement'と一致していません。 問題の原因は誰でも知っていますか? 私はテーブルを最初にソートするバージョンも持っていて、同じエラーが出ます。 は答えを実装した後、あなた
ありがとう:
User ID_option time usage sum_usage_3hr col_i_got
1 a1 12OCT2017:11:22:32 3 12 3
1 a1 12OCT2017:11:20:24 0 9 3
1 a1 12OCT2017:10:34:55 2 9 2
1 a1 12OCT2017:09:55:06 0 7 2
1 a1 12OCT2017:09:43:45 0 7 0
1 a1 12OCT2017:08:59:53 7 7 7
1 a1 12OCT2017:06:59:12 0 0 7
時間変数は数値または文字列として保存されていますか? – user2877959
@ user2877959これは、日時形式で保存されます。 – jovicbg
私の質問には答えられていません。 SASには、数値と文字の2種類しかありません。どちらですか? _ "はフォーマット日時に格納されています" _はSASでは何も意味しません。 datetime形式が適用された数値として格納されているか、またはdatetime形式の値の文字表現として格納されていることを意味すると解釈することができます。数値として格納されている場合、doループは正常です。文字として格納されている場合、doループは明らかに無効であり(文字列から数値を減算する)、そのエラーメッセージはその場合に得られるものです。 – user2877959