Es kommt in der SAS©-Programmierung häufig vor, dass zwei Datensätze miteinander verknüpft werden müssen. Normalerweise verwenden wir eine MERGE-Anweisung in einem DATA-Schritt oder einen LEFT/INNER JOIN in SQL über einen gemeinsamen Schlüssel (z. B. eine Kunden-ID).
Aber was tun, wenn beide Tabellen keine gemeinsamen Variablen haben und die Verknüpfung von komplexen Bedingungen abhängt, wie z.B. Werten, die in bestimmten Intervallen liegen? Dies wird als ungleiche Verknüpfung (Non-Equi Join) bezeichnet.
Betrachten wir einen praktischen Fall aus einer Benutzerdiskussion, um zu verstehen, wie dieses Problem elegant mit PROC SQL gelöst werden kann.
Die vermeintlich gute Idee: Die Schleife im DATA-Schritt
Angesichts dieses Problems ist die erste Intuition oft, einen iterativen Ansatz über einen DATA-Schritt zu versuchen. Die Idee wäre, eine Zeile aus der Tabelle accounts zu lesen und dann die gesamte Tabelle intervals zu durchlaufen, um eine Übereinstimmung zu finden.
Obwohl technisch möglich, ist dieser Ansatz in SAS© komplex zu programmieren:
Er erfordert die Manipulation von zwei Lesepointer.
Es muss das Zurücksetzen des Lesevorgangs der Tabelle
intervalsfür jedes Konto verwaltet werden (was die OptionPOINT=oder mehrereSET-Anweisungen erfordern kann).Der Code wird schnell unübersichtlich und schwer zu warten.
Wie ein Mitwirkender in der Diskussion betont: "Ich würde keine Zeit mit einer Schleifenmethodik verschwenden."
Die elegante Lösung: PROC SQL und das Kartesische Produkt
Die effektivste und lesbarste Lösung liegt in der Verwendung von PROC SQL. Im Gegensatz zum DATA-Schritt ist SQL dazu konzipiert, komplexe Beziehungen zwischen Mengen auf natürliche Weise zu verwalten, ohne sich um die Sortierreihenfolge oder explizite Schleifen kümmern zu müssen.
Der Trick besteht darin, eine kartesische Verknüpfung (alle Zeilen von A kombiniert mit allen Zeilen von B) durchzuführen und das Ergebnis sofort zu filtern.
