Proc SQL

Wie man eine Tabelle anhand einer Liste von IDs mit PROC SQL filtert

Simon 26/02/2020 7 vues

Bei der Datenmanipulation in SAS© ist es sehr üblich, Informationen aus einer Haupttabelle (Quelldataset) auf der Grundlage einer spezifischen Liste von IDs zu extrahieren, die in einer anderen Tabelle enthalten ist.

Wenn Sie bereits vergeblich versucht haben, eine WHERE-Klausel zu schreiben, die direkt auf eine andere Tabelle verweist, erklärt Ihnen dieser Artikel die korrekte Syntax, um diesen Vorgang effizient mit PROC SQL durchzuführen.

Illustration

Das Szenario

Stellen wir uns vor, wir haben zwei Tabellen:

  1. Tabelle A: Eine eingeschränkte Liste von Patienten-IDs (pat_id). Das ist unser Filter.

  2. Tabelle B: Eine vollständige Datenbank mit Messungen (var1, var2) für viele Patienten.

Das Ziel: Ein neues Dataset erstellen, das nur die Zeilen aus Tabelle B enthält, deren pat_id in Tabelle A vorhanden ist.

Illustration

Der häufige Fehler

Intuitiv könnte man eine Abfrage schreiben wollen, die so aussieht: ... where pat_id in tableA;

Allerdings erlaubt SAS© nicht, eine rohe Tabelle direkt in einer IN-Klausel zu referenzieren. Man muss eine sogenannte Unterabfrage (sub-query) verwenden.

Die Lösung: Die Unterabfrage

Damit die WHERE-Klausel funktioniert, muss sie die Variable pat_id mit einer Liste von Werten vergleichen, die von einer SELECT-Abfrage zurückgegeben wird.

Hier ist die korrekte Syntax:

1PROC SQL;
2 create TABLE want as
3 select *
4 from table_b
5 where pat_id in ( select pat_id from table_a );
6QUIT;

Wie funktioniert das?

  1. Die Klammer (Unterabfrage): Der Code select pat_id from table_a wird zuerst ausgeführt. Er generiert die Liste der zu behaltenden IDs (hier: 1, 2, 3).

  2. Die Hauptabfrage: SAS© durchläuft dann die table_b und behält nur die Zeilen, bei denen die pat_id einer der von der Unterabfrage gefundenen IDs entspricht.

Endergebnis

Wenn Sie den obigen Code ausführen, erhalten Sie die folgende Tabelle want, die eine exakte Kopie der Daten aus Tabelle B ist, gefiltert nach Tabelle A:

pat_idvar1var2
1353.5
2776.7
3155.3

Diese Methode ist sauber, effizient und standardisiert, um relationale Daten in SAS© über die SQL-Sprache zu filtern.