Il arrive souvent en programmation SAS© que l'on doive croiser deux jeux de données. Habituellement, nous utilisons une instruction MERGE dans une étape DATA ou une jointure LEFT/INNER JOIN en SQL via une clé commune (par exemple, un ID client).
Mais comment faire lorsque les deux tables n'ont aucune variable en commun et que la jointure dépend de conditions complexes, comme des valeurs comprises dans des intervalles ? C'est ce qu'on appelle une jointure non équitable (Non-Equi Join).
Examinons un cas pratique issu d'une discussion entre utilisateurs pour comprendre comment résoudre ce problème élégamment avec PROC SQL.
La fausse bonne idée : La boucle dans l'étape DATA
Face à ce problème, la première intuition est souvent de tenter une approche itérative via une étape DATA. L'idée serait de lire une ligne de la table accounts, puis de boucler sur toute la table intervals pour trouver une correspondance.
Bien que techniquement possible, cette approche est complexe à coder en SAS© :
Elle nécessite de manipuler deux pointeurs de lecture.
Il faut gérer la réinitialisation de la lecture de la table
intervalspour chaque compte (ce qui peut nécessiter l'optionPOINT=ou de multiples instructionsSET).Le code devient rapidement lourd et difficile à maintenir.
Comme le souligne un contributeur dans la discussion : "Je ne perdrais pas de temps sur une méthodologie de boucle."
La Solution Élégante : PROC SQL et le Produit Cartésien
La solution la plus efficace et la plus lisible réside dans l'utilisation de la PROC SQL. Contrairement à l'étape DATA, le SQL est conçu pour gérer naturellement les relations complexes entre les ensembles sans se soucier de l'ordre de tri ou de boucles explicites.
L'astuce consiste à effectuer une jointure cartésienne (toutes les lignes de A combinées à toutes les lignes de B) et à filtrer immédiatement le résultat.
