1

現在のコードにこのproc sqlクエリがあります。残念ながら、私は 1,000 万件を超えるレコードを扱っているため、実行に数時間かかります。はるかに速く実行されると考えて、データステップに変換しようとしています。ただし、同じデータ結果が得られないようです。誰かがデータステップで私を助けることができれば、私はそれを大いに感謝します. または、proc sql をより効率的に実行する方法について提案がある場合。

これが私のproc SQLクエリです:

proc sql;
  create table test as
  select *
  from table1 a
  where exists (select 1
                from table2 b
                where b.acct_id = a.acct_id);
quit;

これは、変換しようとしたデータステップです。

proc sort data=table1; by acct_id; run;
proc sort data=table2; by acct_id; run;

data test;
  merge table1   (in=a)
        table2   (in=b);
  by acct_id;
  if a and b;
run;
4

2 に答える 2

0

SQL で内部結合を試してください。一致させる必要のある各変数をリストする必要があります。

create table test as
select *
    from
        table1 as a
      inner join
        table2 as b
      on a.acct_id = b.acct_id
      and a.var1 = b.var2 
        ....
      ;

これにより、時間が費やされていると思われる内部選択を回避する必要があります。

それが遅すぎる場合は、両方のテーブルの acct_id にインデックスを配置することを検討してください。これにより、結合が高速化されるはずです。

于 2016-04-11T12:34:50.250 に答える
0

現在のデータステップが機能しない理由は、table2 に重複したキーがあるためである可能性が最も高いです (これにより、1-N または NN マージがある場合に観測が歪められます)。キーのみを保持し、重複を削除するように並べ替えを修正すると、マージによって期待される結果が得られるはずです。

proc sort data=table1; by acct_id; run;
proc sort data=table2 (keep=acct_id) out=wanted_accounts nodupkey; by acct_id; run;

data test;
merge table1 (in=a)
      wanted_accounts (in=b);
by acct_id;
if a and b;
run;
于 2016-04-11T13:07:48.483 に答える