2016-12-02 5 views
2

Blockquote2つの異なる列に基づいて繰り返し値を削除するにはどうすればよいですか?

Ex。私がCOLUMN Aに値 "a"を持っていれば、COLUMN AとCOLUMN Bに同じ値を表示すべきではありません。 "a"で今度はその値 "c"も選択されます。ここで、 "c"がテーブルのどこにも表示されないようにする必要があります。以下にサンプルデータセットを示します。私は列Aの結​​果を以下に言及されていることによってでNODUPKEYにしようとすると、結果セットのみ

Col A Col B 
a c 
b d 
e f 

を含まなければならないような場合には

Col A Col B 
a c 
a b 
a a 
b d 
b b 
b a 
c c 
c d 
c a 
d g 
e f 

。しかし値は繰り返されています。

Col A Col B 
a c 
b d 
c c 
d g 
e f 

私にお知らせください。ここで

+0

与えられた入力に対して(a b)(c d)(e f)も有効な結果セットですか?そうでない場合は、どうしてですか? – user667489

+0

値が繰り返されていないため、有効な結果セットにすることができます。それを達成する方法? –

答えて

0

は、データセットを通じて作業中の値は、列のいずれかで、これまで見てきたこれを追跡するために、ハッシュオブジェクトを使用して、これを行う1つの方法です:

data have; 
input (A B) ($); 
cards; 
a c 
a b 
a a 
b d 
b b 
b a 
c c 
c d 
c a 
d g 
e f 
; 
run; 

data want; 
set have; 
if _n_ = 1 then do; 
    declare hash h(); 
    rc = h.definekey('a'); 
    rc = h.definedone(); 
end; 
if h.add(KEY:a,DATA:a)=0 then if h.add(KEY:b,DATA:b)=0 then output; 
drop rc; 
run; 

これは貪欲なアプローチである - に場合によっては、入力データセットから生成される可能性があるより多くの行を持つ有効な出力データセットが存在することもありますが、ほとんどの場合、適切なジョブを実行する必要があります。

+0

ありがとう! –

0

この問題を解決するには、ハッシュテーブルが最適です。ここに配列:

data want; 
    set have; 
    array temp [50]$ _temporary_; ; 
    array var A--B; 
    retain temp j; 
    if _n_=1 then do; 
     output; 
     j=1; 
     do i=1 to dim(var); 
      temp(j)=var(i); 
      j+1; 
     end; 
    end; 
    else do; 
     do i=1 to dim(var); 
      if whichc(var(i), of temp(*))>0 then return; 
     end; 
     output; 
     do i=1 to dim(var); 
      temp(j)=var(i); 
      j+1; 
     end; 
    end; 
    drop i j; 

実行;

関連する問題