-1

最初のテーブルには、以下のようなキー値と時間が含まれています

表:Time_Stamp

2 番目のテーブルには、開始日と終了日を持つ各 ID が含まれています。

表:タイムテーブル

time_stamp から各行の ID を知りたいです。

期待される結果

カテゴリの固定数があります。しかし、IDがたくさんあります。

SQL クエリの書き方を教えてください。(どのSQLスタイルでも構いません。変換できます。SAS互換のPROC SQLの方が良いでしょう)

4

2 に答える 2

1

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;
于 2014-11-30T14:18:34.793 に答える
0
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
于 2014-11-30T07:01:39.587 に答える