最初のテーブルには、以下のようなキー値と時間が含まれています
2 番目のテーブルには、開始日と終了日を持つ各 ID が含まれています。
time_stamp から各行の ID を知りたいです。
カテゴリの固定数があります。しかし、IDがたくさんあります。
SQL クエリの書き方を教えてください。(どのSQLスタイルでも構いません。変換できます。SAS互換のPROC SQLの方が良いでしょう)
SAS でこれを行っている場合は、形式を使用する方が適切です。フォーマットには、開始/終了範囲を取るという利点があり、非常に高速です。正しく思い出せば、約 o(1) 時間です。これは、より大きなデータセットをソートする必要はありません (また、それが問題である場合は、より小さなデータセットのソートを回避することさえできます)。ほとんどの SQL ソリューションは、より小さなデータセットを (ハッシュ テーブルとして) メモリに保持できない限り、おそらくそうするでしょう。
最初の 2 つのformat_two
データ ステップは、上記のデータを作成するだけです。データ ステップは、何か新しいことを行う最初のステップです。
より多くのカテゴリがある場合、それらが数値ではなくアルファベットである限り、これは問題なく機能するはずです。変更したい唯一の違いif _n_ le 2
は、2 つが等しい (カテゴリの総数) であることです。
data time_Stamp; *Making up the test dataset;
category='A';
do value=1 to 6;
time = intnx('HOUR','01NOV2014:00:00:00'dt,value-1);
output;
end;
category='B';
do value = 7 to 12;
time = intnx('HOUR','01NOV2014:00:00:00'dt,value-4);
output;
end;
run;
data time_table; *Making up the ID dataset;
informat start_time end_time datetime18.;
input id category $ start_time end_time;
datalines;
1 A 01NOV2014:00:00:00 01NOV2014:03:00:00
1 B 01NOV2014:00:03:00 01NOV2014:06:00:00
2 A 01NOV2014:03:00:00 01NOV2014:06:00:00
2 B 01NOV2014:06:00:00 01NOV2014:09:00:00
;
quit;
*This restructures time_table into the needed structure for a format lookup dataset;
data format_two;
set time_table;
fmtname=cats('KEYFMT',category); *This is how we handle A/B - different formats. If it were numeric would need to end with 'F'.;
start=start_time;
end=end_time;
label=id;
eexcl='Y'; *This makes it exclusive of the end value, so 03:00 goes with the latter ID and not the former.;
hlo=' ';
output;
if _n_ le 2 then do; *This allows it to return missing if the ID is not found. ;
*le 2 is because we want one for each category - if more categories, needs to be hifgher;
hlo='o';
label=' ';
call missing(of start end);
output;
end;
run;
*Have to sort to group formats together, but at least this is the small dataset;
*If even this is a time concern, this could be done differently (make 2 different datasets above);
proc sort data=format_two;
by fmtname;
run;
*Import the format lookups;
proc format cntlin=format_two;
quit;
*Apply using PUTN which allows specifying a format at runtime;
data table_one_ids;
set time_stamp;
id = putn(time,cats('KEYFMT',category));
run;
SELECT Time_stamp.Category, Time_stamp.Time, Time_stamp.Value, Time_Table.ID
FROM Time_stamp INNER JOIN
Time_Table
ON Time_stamp.Category = Time_Table.Category
AND Time_stamp.Time BETWEEN Time_Table.Start_time AND DATEADD(SS,-1,Time_Table.End_time)
ORDER BY Time_stamp.Category,TIME