Verschachtelte SQL-Abfragen

Aus SAS-Wiki
Wechseln zu: Navigation, Suche

von Heribert Ramroth aus: Carina Ortseifen, Grischa Pfister, Heribert Ramroth, Marianne Weires: Tipps und Tricks für den leichteren Umgang mit der SAS Software, KSFE 2010.

Durch die Verwendung verschachtelter SQL Abfragen können Datensätze in bestimmten Situationen elegant aus einer Tabelle herausgefiltert werden.

Ausganssituation

Gegeben seien Daten im sogenannten Phasenkonzept, das heißt für jede Person, zum Beispiel mit der Variablen ID identifiziert, seien Datenzeilen aus mehreren Phasen vorhanden. Diese Situation tritt zum Beispiel bei der Erhebung von Krankenhausaufenthalten von Patienten auf, beim Erheben von Rauchphasen oder bei wiederholten Einkäufen eines Kunden. Das Beispiel in Tabelle 1 zeigt Daten von Rauchphasen mehrerer Studienteilnehmer. Angenommen, das Interesse gilt all den Studienteilnehmern, die mindestens 3 Rauchphasen haben, hier also den Teilnehmern mit den IDs 3 und 5. Ziel ist es, die gesamte Rauchhistorie der Teilnehmer darzustellen, nicht nur die Informationen der Phasen größer 3. Letzteres wäre im Datenschritt mit der Bedingung (if Phase>3) leicht möglich. Abbildung der gesamten Rauchhistorie (= im Beispiel auch der Phasen 1 und 2 dieser beiden Teilnehmer) erfordert bei alleiniger Verwendung von Daten- und Prozedurschritten mehrere Durchgänge, zum Beispiel Kombination <Mergen> mit den Originaldaten. Dies lässt sich leichter mit Hilfe von PROC SQL lösen.

Tabelle 1: Rauchphasen in einer Studie
ID Phase Beginn Ende Zig
  1 1 54 57 20
  1 2 57 98 60
  2 1 48 91 20
* 3 1 58 68 20      Die Datensätze mit *
* 3 2 68 94 40      sollen ausgewählt
* 3 3 94 98 20      werden.
* 3 4 68 75 25
  4 1 76 82 25
* 5 1 95 98 6
* 5 2 42 52 5
* 5 3 59 68 15

Lösung mit PROC SQL

Verwendung zweier verschachtelter Select-Anweisungen. Die innere Select-Anweisung selektiert die IDs aller Datensätze, deren Phasennummer größer oder gleich 3 ist. Diese Liste der IDs ist Auswahlkriterium für die äußere Select-Anweisung. Somit werden auch doppelte IDs aufgelistet.

PROC SQL;
     SELECT *
     FROM Rauchdaten
     WHERE ID in
          (SELECT ID
           FROM Rauchdaten
           WHERE Phase >= 3)
     ORDER BY ID, Beginn; QUIT;