2017-07-05 14 views
0

SASの履歴ファイルを更新したい。私は、既存のデータラインと重複するかもしれない新たな観測を持っています。条件付きでマージを出力する

必要なものは、データセット(new_data)の存在する行と存在しない場合は古いセット(old_data)からの行を持つファイルです。私が思いついたのは、データセットの順番に条件付きの、厄介なマージ操作です。 (== NEW_DATAがOLD_DATAの後である場合にのみ機能します:。?)

data new_data; 
    input key value; 
datalines; 
    1 10 
    1 11 
    2 20 
    2 21 
    ; 
run; 

data old_data; 
    input key value; 
    datalines; 
    2 50 
    2 51 
    3 30 
    3 31 
    ; 
run; 

だから私は、次のことをしたいのです:

key value 
1 10 
1 11 
2 20 
2 21 
3 30 
3 31 

以下は動作しませんが。その下に出力が生成されます。

data updated_history; 
    merge old_data(in=b) New_data(in=a); 
    by key; 
    if a or (b and not a); 
run; 

質問:

data updated_history; 
    merge New_data(in=a) old_data(in=b) ; 
    by key; 
    if a or (b and not a); 
run; 

.... 
2 50 
2 51 
... 

しかし、これがない何らかの理由で

管理するインテリジェントな方法がありますが、そこから値がから選択されているデータセット。何かのように:if then value_from_dataset a;

+0

サンプル入力ファイルには、キー値ごとに複数の観測値があります。単純な例では、共有キーは各ファイル内の観測数と同じ数になります。しかし、観測数が一致しない場合は、MERGEを使用して必要なことをするのに問題があります。 – Tom

答えて

2

MERGEのデータセットのリストは、データが取得される順序です。したがって、注文がoldの場合、の値がnewから読み取られ、newの値がoldの値を上書きします。これは、第2のバージョンが動作し、第1のバージョンが動作しない理由です。

0

キー値ごとに複数の観測値があるので、これらのファイルを結合するためにMERGEを使用しないことをお勧めします。 2つのDOWループを使用してデータを2回読み取ることで、SETを使用して実行できます。その場合、レコードは結合されるのではなくインターリーブされるため、SETステートメントのデータセットの順序は関係ありません。この最初のループは、このKEY値を観測している2つの入力データセットのどちらを計算します。

data want ; 
    anyold=0; 
    anynew=0; 
    do until (last.key); 
    set old_data (in=inold) new_data(in=innew); 
    by key ; 
    if inold then anyold=1; 
    if innew then anynew=1; 
    end; 
    do until (last.key); 
    set old_data (in=inold) new_data(in=innew); 
    by key ; 
    if not (anyold and anynew and inold) then output; 
    end; 
    drop anyold anynew; 
run; 

このタイプの組み合わせは、おそらくSQLを使用してコードする方が簡単です。

proc sql ; 
    create table want as 
    select key,value from new_data 
    union 
    select key,value from old_data 
    where key in (select key from old_data except select key from new_data) 
    order by 1 
    ; 
quit; 
関連する問題