1

こんにちは、Sas で 2 つのテーブルをマージする必要があります

ただし、SQL マージ ステートメントのような条件を使用します。

MERGE INTO TABLE_NAME USING table_reference ON (condition)
WHEN MATCHED THEN
UPDATE SET column1 = value1 [, column2 = value2 ...]
WHEN NOT MATCHED THEN
INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...

そのようなものがありますか?

ない場合は、この種の条件を追加する方法を教えてください。

4

2 に答える 2

1

MODIFYを使用して、新しい行を挿入したり、既存のデータを置き換えたりすることができます。コードは次のようになります(何に一致しているのか、その他の条件がわからない限り、これ以上具体的にすることはできません)。警告の言葉ですが、両方のデータセットが大きい場合、トランザクションデータセットの各行のマスターデータセットに対して個別のルックアップが実行されるため、この方法でMODIFYを使用することは非常に非効率的です。@Robのソリューションのようにインデックスを使用すると、この場合のパフォーマンスが向上します。@Robが言うように、代替手段はUPDATE(ここではMODIFYに似ています)または単に標準のMERGEを使用することです。どちらも、その場で変更するのではなく、既存のデータセットを置き換えます。最後のオプションは、現在のコードに似たものを使用できるPROCSQLを使用することです。

data master;
modify master (in=a) transaction (in=b);
by id;
if not a and <condition> then do;
    _error_=0;
    output;
    end;
else if a and b and <condition> then replace;
run;
于 2012-08-01T08:05:01.210 に答える
0

これを行う簡単な方法はわかりません。過去にそれを行ったとき、最初に新しい行を追加し(を使用proc append)、次にmodify既存の行に2番目のステップを実行しました。変更ステップでは、テーブルをインプレースで再構築する場合、単一のデータステップでデータステップsetとステートメントを組み合わせて使用​​する必要があります。modifyこれを行う利点は、I/O が大幅に少なくなり (テーブルが大きく、更新するサブセットが小さい場合)、既存のインデックスが保持されることです。欠点は、それがはるかに複雑であることです。コードは次のようになります。

  **
  ** REPLACE VALUES IN CPANEL.PW_STAT WITHOUT REBUILDING THE ENTIRE TABLE.
  *;
  data cpanel.pw_stat;

    set redirect_updates;
    modify cpanel.pw_stat key=primary;

    select(_iorc_);  
      when(%sysrc(_sok)) do;
        * MATCHED TRANSACTION DATASET TO MASTER DATASET. REPLACE THE VALUE;
        if date_redirected ne tmp_date_redirected then do;
          date_redirected = tmp_date_redirected;
          replace;
        end;
      end;
      when(%sysrc(_dsenom)) do;
        * NO MATCH. DO NOT ADD OBS OR REPLACE OBS OR DELETE OBS.  RESET ERR AND DO NOTHING.;
        _error_ = 0;
      end;
      otherwise do;
        put 'ERROR: Unexpected value for _IORC_= ' _iorc_;
        put 'Program terminating. DATA step iteration # ' _n_;
        put _all_;
        stop;
      end;
    end;
  run;

パフォーマンスが問題にならない場合は、テーブルを最初から再作成する方がはるかに優れていることを付け加えておきます。

于 2012-07-31T20:00:32.097 に答える