n:m nach 1:1

T-Bone Steak

Neuer Benutzer
Beiträge
2
Hallo zusammen,

erstmal "Grüß Gott" das ist mein erster Post hier. :)

Ich versuche mal, mein Problem halbwegs strukturiert darzustellen:

Die Entwicklungsumgebung ist SAS. Es steht also SAS Base und SQL zur Verfügung.

Ich habe 2 Tabellen (T1 und T2), beide haben dieselbe Struktur (also dieselben Felder), beide haben einen PK (PK1 und PK2). Am Schluss soll eine Mapping-Tabelle rauskommen PK1 = PK2.
Der erste Join geht über die Vergleichsfelder, heraus kommt eine Liste PK1(n) = PK2(m). Das ist soweit auch erstmal richtig.
Als nächstes habe ich diese Liste nach PK1, PK2 sortiert und mir den jeweils ersten Eintrag der Gruppe geben lassen und dachte, ich wäre fertig. Stimmt aber leider nicht, denn da kommt dummerweise 1:m raus. Es wird also ein PK2 Eintrag auch zu anderen PK1 zugeordnet. Das ist fachlich möglich, wenn aber der Fall vorkommt, soll aus der n:m Beziehung einfach ein anderes m genommen werden bzw. wenn das nicht möglich ist, eben gar nichts gewählt werden.

Und ich komme einfach nicht drauf, wie das gehen soll...
 
Werbung:
Die selben Felder heist auch die selben Daten? Ich verstehe nicht ganz, welche Daten verknüpft werden sollen, das müsstest du erläutern.

Erstmal hast du ja, wie beschrieben, ein Kreuzprodukt aus beiden Tabellen. Beispiel:
(Die Summen der beiden Tabelleneinträge mit einander multipliziert ergibt die Summe des Kreuzproduktes)
PK1A <-> PK2A
PK1A <-> PK2B
PK1A <-> PK2C
PK1B <-> PK2A
PK1B <-> PK2B
PK1B <-> PK2C
PK1C <-> PK2A
PK1C <-> PK2B
PK1C <-> PK2C
 
Ich bin mittlerweile auf den Trichter gekommen.
@Ukulele: Ja, diese Annahme ist korrekt.

Folgende Lösung:
a) Sortieren nach PK2
b) Folgender SAS Code löscht aus PK2 alle Doppelten vorkommen bis auf den ersten
data foo2;
set foo1;
by PK2;
if not first.PK2 then PK2 = "";
run;

c) Sortieren, missing values an den Schluss
proc sort data = foo2 out = foo3;
by PK1 DESCENDING PK2;
run;

d) Beim jeweils ersten vorkommen von PK1 prüfen, ob PK2 gefüllt ist. Wenn ja, Treffer und ausgeben.
data foo4;
set foo3;
by PK1 DESCENDING PK2;

if first.PK1 then do;
if PK2 ne "" then output;
end;
run;

e) FREU!!! Funktioniert.

Man könnte jetzt einwenden, daß die Auswahl von PK2 ausschließlich nach Sortierung erfolgt und nicht nach qualifizierten
Bedingungen. Für meinen speziellen Fall ist das egal, aber für Statistiker würde es wohl nicht taugen...
 
Werbung:
Zurück
Oben