2016-10-26 11 views
0

私は基本的にデータセットを2つに分けています(IDと欠落IDを持つもの)。 IDの記入に役立つマッチキーのセット。私は以下の合計レコードを5つ持っており、最終データセットは5つのレコードをすべて保持する必要があります。以下の例である:非欠落データCPOOLSAS:マージするか結合して不足している間にすべてのレコードを保持する

. M123 
. M456 

DATA TEST; 
    LENGTH ID MKEY $12.; 
    INPUT ID $ MKEY $; 
    DATALINES; 
    . M123 
    . M456 
    A M123 
    B M456 
    C M789 
    ; 
RUN; 

DATA MPOOL CPOOL; SET TEST; 
    IF ID IN ("","0") THEN DO; 
     MISS_ID = 1; 
     OUTPUT MPOOL; 
    END; 
    ELSE DO; 
     MISS_ID = 0; 
     OUTPUT CPOOL; 
    END; 
RUN; 

は、だから我々は、失われたデータMPOOLをマージ終わる

A M123 
B M456 
C M789 

のみマージする私に3つのレコードを与えます私はすべてのレコードを維持し、欠落を埋める必要があります(MKEYを通じて、AレコードとBレコードを欠落IDにリンクする必要があります)。 W:

A M123 
A M123 
B M456 
B M456 
C M789 

SQL JOINのどのような私は、すべてのレコードを保持し、正常に参加されたもので行方不明を埋めるためにできるようになりますか?実現可能だが、MERGEのデータはすべてのレコードを保持しない。私はこの例を遅らせる/保持する/記入することができますが、私が作業している大きなデータは他の要因によってマージ/結合が必要です。

答えて

1

一つの方法は、union alljoinを使用しています:

proc sql; 
    select c.id, c.mkey 
    from cpool c 
    union all 
    select c.id, m.mkey 
    from mpool m join 
     cpool c 
     on m.mkey = c.mkey; 
+0

これは有望なゴードンに見える、ありがとう。 警告:UNION ALLセット操作を実行するために、テーブルがNULL列で拡張されました。 警告:MKEYという名前の列は、選択式(またはビュー)に複製されます。 ' '警告:変数MKEYはファイルWORK.MERGEDに既に存在します。 ' – Foxer

+0

@Foxer。 。 。これは結果に影響を及ぼしますか? –

+0

はい、私は233,836のレコードを期待しており、233,598のレコードしか出力していません。それは困惑している238のレコードの違いです。 @Foxer。 – Foxer

0

またIDを埋めるためにデータステップを使用してみてください。

proc sort data=test; 
by mkey descending id; 
run; 

data want; 
    set test; 
    retain temp; 
    by mkey id notsorted; 
    if first.mkey then temp=id; 
    if missing(id) then id=temp; 
    drop temp; 
run; 
+0

私はこの例ではretainを使用して動作させることができますが、他の複数の変数や要因のためにmerge/joinを使用する必要があることを私の説明で述べました。 – Foxer

関連する問題