2016-12-02 3 views
2

BlockquoteWie können wiederholte Werte basierend auf zwei verschiedenen Spalten entfernt werden?

Für Ex. wenn ich den Wert "a" in SPALTE A habe, sollte der gleiche Wert nicht in SPALTE A und SPALTE B erscheinen. Jetzt mit "a" wird auch der Wert "c" für diese Beobachtung ausgewählt. Jetzt müssen wir sicherstellen, dass "c" nicht irgendwo in der Tabelle erscheinen sollte. Unten ist ein Beispieldatensatz.

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 

Im obigen Fall sollte das Ergebnis Satz

Col A Col B 
a c 
b d 
e f 

enthält nur Wenn ich mit NODUPKEY mit nach Spalte A versuche, wird das Ergebnis unten erwähnt. Aber die Werte wiederholen sich.

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

Bitte lassen Sie mich wissen. Hier

+0

Ist (a b) (c d) (e f) ein gültiges Ergebnis für die von Ihnen eingegebenen Eingaben? Wenn nicht, warum nicht? – user667489

+0

Es kann eine gültige Ergebnismenge sein, da sich keine Werte wiederholen. Wie erreiche ich das? –

Antwort

0

ist ein Weg, dies zu tun, ein Hash-Objekt verwenden, um zu verfolgen, welche Werte haben bisher in jeder Spalte gesehen worden, während sie durch den Datensatz arbeiten:

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; 

Dies ist ein gieriger Ansatz - in In einigen Fällen könnte es ein gültiges Ausgabe-Dataset mit mehr Zeilen geben, die aus Ihrem Eingabe-Dataset erstellt werden könnten, aber es sollte die meiste Zeit einen vernünftigen Job machen.

+0

Vielen Dank! –

0

Hash-Tabelle ist der beste Weg, um dieses Problem zu lösen. Hier ist Array:

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; 

laufen;

Verwandte Themen