Set Operations : Jouons aux Lego avec vos tables (façon Skynet)

Cet article en deux mots :

Marre de l'étape DATA ? Découvrez comment fusionner vos tables comme un pro avec les Set Operations de la PROC SQL. De la gestion intelligente des doublons avec UNION à la puissance de l'instruction OUTER UNION CORR, apprenez à manipuler vos données avec la précision d'un Terminator.

Imaginez la situation : Skynet vient de prendre le contrôle de deux usines de production de cyborgs indépendantes, l'une à Los Angeles (LA), l'autre à San Francisco (SF). Chaque usine possède sa propre base de données répertoriant les modèles fabriqués.

Votre mission, si vous l'acceptez (et vous n'avez pas vraiment le choix face à une IA génocidaire), est de fusionner ces inventaires pour avoir une vue globale de l'armée. Nous ne voulons pas croiser des informations avec une clé de jointure comme dans l'article précédent, nous voulons empiler nos tables les unes sur les autres.

En SAS classique, vous feriez une étape DATA avec l'instruction SET. En PROC SQL, nous utilisons les Set Operations : UNION, OUTER UNION, EXCEPT et INTERSECT. Et attention, elles ne fonctionnent pas du tout comme le SET traditionnel !

Commençons par préparer nos deux bases de données d'usines :

SAS


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* Base de l'usine de Los Angeles */
data work.usine_la;
length Modele $10 Statut $15 Quantite 8;
infile datalines dlm=',';
input Modele $ Statut $ Quantite;
datalines;
T-800,Actif,50
T-1000,Actif,10
T-600,Détruit,100
;
run;

/* Base de l'usine de San Francisco */
data work.usine_sf;
length Modele $10 Statut $15 Quantite 8;
infile datalines dlm=',';
input Modele $ Statut $ Quantite;
datalines;
T-800,Actif,50 /* Attention, doublon exact avec LA ! */
T-X,Actif,5
T-850,En test,20
;
run;

1. UNION : La fusion intelligente (qui n'aime pas les clones)

L'opérateur UNION empile les résultats de deux requêtes. Mais il a une particularité cruciale que l'examen de certification adore tester : il supprime automatiquement les doublons stricts.

SAS


1
2
3
4
5
proc sql;
select * from work.usine_la
UNION
select * from work.usine_sf;
quit;

Résultat : Bien que nos deux usines aient déclaré "50 T-800 Actifs", cette ligne n'apparaîtra qu'une seule fois dans le résultat final. UNION a fait le ménage.

Si Skynet veut vraiment voir toutes les lignes, y compris les doublons (pour savoir que 50 + 50 = 100 T-800 au total), il faut utiliser UNION ALL. Astuce de perf : UNION ALL est plus rapide car SAS n'a pas besoin de trier les données en arrière-plan pour chercher et éliminer les doublons.

2. OUTER UNION : Le vrai équivalent du DATA StepBloc de programmation SAS itératif utilisé pour lire, transformer et manipuler des données ligne par ligne afin de créer des tables de sortie personnalisées et calculer de nouvelles variables.

Si vous voulez reproduire exactement le comportement d'une instruction SET de l'étape DATA (empiler sans se poser de questions, garder les doublons, et créer des colonnes vides si les tables n'ont pas exactement les mêmes variablesColonnes d'une table SAS contenant des données spécifiques (numériques ou caractères). Elles possèdent des attributs comme le nom, le type, la longueur, l'étiquette et le format d'affichage.), vous devez utiliser OUTER UNION.

Mais attention, par défaut, la PROC SQL empile les colonnes par leur position (la colonne 1 avec la colonne 1, la colonne 2 avec la 2), et non par leur nom !

Pour dire à SAS "empile les colonnes qui ont le même nom ensemble", il faut rajouter le mot-clé magique CORR (pour Corresponding).

SAS


1
2
3
4
5
6
/* L'équivalent exact d'un DATA SET classique */
proc sql;
select * from work.usine_la
OUTER UNION CORR
select * from work.usine_sf;
quit;

Sans le CORR, si vos colonnes étaient dans le désordre, vous vous retrouveriez avec des quantités mélangées avec des statuts. Un vrai bug dans la Matrice.

3. EXCEPT : Trouve l'intrus

Skynet veut savoir quels modèles sont fabriqués à Los Angeles, mais pas à San Francisco. L'opérateur EXCEPT (parfois appelé MINUS dans d'autres langages SQL) prend la première table et en soustrait toutes les lignes qui sont également présentes dans la deuxième.

SAS


1
2
3
4
5
proc sql;
select Modele from work.usine_la
EXCEPT
select Modele from work.usine_sf;
quit;

Résultat : Le T-1000 et le T-600. (Le T-800 a été soustrait puisqu'il est aussi fabriqué à SF). C'est extrêmement utile pour faire des comparaisons de listes ou trouver des données manquantes.

4. INTERSECT : Les points communs

À l'inverse, quels sont les modèles fabriqués à la fois dans l'usine de LA et celle de SF ? C'est le rôle de l'opérateur INTERSECT.

SAS


1
2
3
4
5
proc sql;
select Modele from work.usine_la
INTERSECT
select Modele from work.usine_sf;
quit;

Résultat : Le T-800. C'est le seul modèleReprésentation mathématique entraînée sur des données pour capturer des tendances, prédire des résultats ou classifier des observations via des algorithmes (Régression, Forêt aléatoire, Gradient Boosting). que nos deux usines ont en commun.

Le récap' pour l'examen 🎓

L'erreur la plus fréquente le jour de la certification est de confondre l'alignement des colonnes. Mémorisez ceci :

  • Les Set Operations (UNION, EXCEPT, INTERSECT) alignent par défaut les données par position (colonne 1 avec colonne 1).
  • Pour forcer SAS à aligner par le nom de la variable, il faut toujours ajouter le mot-clé CORR.
  • UNION, EXCEPT et INTERSECT suppriment les doublons par défaut.
  • OUTER UNION garde tout par défaut.

Conclusion

Vous maîtrisez maintenant l'art de compiler des rapports globaux à partir de sources disparates. Skynet est ravi, vos troupes sont prêtes et vos requêtes sont propres.

Dans l'Article 5, nous allons refermer ce premier grand chapitre sur la PROC SQL en voyant comment manipuler la structure même de vos bases : créer des tables à partir de rien, les modifier, et surtout, ajouter des contraintes d'intégrité pour empêcher n'importe qui d'insérer des données corrompues dans le système (comme un T-800 avec des points de vie négatifs, par exemple).

Nicolas Housset

Passionné d'informatique, je suis Consultant et expert technique SAS VIYA, également co-fondateur de la société Flexcelite. Spécialisé dans les technologies SAS (Viya, 9.4) et les infrastructures associées (Linux, Hadoop, Azure), ce blog est mon espace pour partager mes mémos techniques et retours d'expérience.