Proc SQL

Comment filtrer une table à partir d'une liste d'identifiants avec PROC SQL

Simon 26/02/2020 8 vues

Il est très courant, lors de la manipulation de données sous SAS©, de devoir extraire des informations d'une table principale (dataset source) en se basant sur une liste spécifique d'identifiants contenue dans une autre table.

Si vous avez déjà tenté d'écrire une clause WHERE faisant référence directement à une autre table sans succès, cet article vous explique la syntaxe correcte pour réaliser cette opération efficacement avec PROC SQL.

Illustration

Le Scénario

Imaginons que nous disposons de deux tables :

  1. Table A : Une liste restreinte d'identifiants patients (pat_id). C'est notre filtre.

  2. Table B : Une base de données complète contenant des mesures (var1, var2) pour de nombreux patients.

L'objectif : Créer un nouveau dataset contenant uniquement les lignes de la Table B dont le pat_id est présent dans la Table A.

Illustration

L'Erreur Fréquente

Intuitivement, on pourrait vouloir écrire une requête ressemblant à ceci : ... where pat_id in tableA;

Cependant, SAS© ne permet pas de référencer une table brute directement dans une clause IN. Il faut utiliser ce qu'on appelle une sous-requête (sub-query).

La Solution : La Sous-Requête

Pour que la clause WHERE fonctionne, elle doit comparer la variable pat_id à une liste de valeurs renvoyée par une requête SELECT.

Voici la syntaxe correcte :

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;

Comment cela fonctionne ?

  1. La parenthèse (Sous-requête) : Le code select pat_id from table_a est exécuté en premier. Il génère la liste des ID à conserver (ici : 1, 2, 3).

  2. La requête principale : SAS© parcourt ensuite la table_b et ne garde que les lignes où le pat_id correspond à l'un des ID trouvés par la sous-requête.

Résultat Final

En exécutant le code ci-dessus, vous obtiendrez la table want suivante, qui est une copie exacte des données de la Table B, filtrée par la Table A :

pat_idvar1var2
1353.5
2776.7
3155.3

Cette méthode est propre, efficace et standardisée pour filtrer des données relationnelles sous SAS© via le langage SQL.