deduplication

deduplicate

##set_deduplication

Description

deduplicate

L'action `deduplicate` du set d'actions `deduplication` est un peu le videur intraitable de votre base de données : "Toi tu passes, toi tu es un clone, tu sors !" . Elle permet d'éliminer les lignes en double (ou les lignes uniques) selon des clés de regroupement. Grâce à des options avancées de tri en amont (`orderBy`), vous contrôlez exactement quelle ligne survit à l'opération, tout en ayant la possibilité de stocker les enregistrements éliminés dans des tables annexes pour vérification.

Syntaxe Officielle
proc cas;
deduplication.deduplicate /
table={name="nom_table", groupBy={"var1", "var2"}, orderBy={{name="var3", order="DESCENDING"}}}
casOut={name="table_sortie", replace=true}
duplicateOut={name="table_doublons", replace=true}
uniqueOut={name="table_uniques", replace=true}
noDuplicateKeys=true
noUniqueKeys=false
groupByRaw=false;
quit;

Paramètres Clés

Nom du paramètre Description
table Spécifie la table d'entrée . C'est ici que l'on définit le `groupBy` (les clés de dédoublonnage) et surtout le `orderBy` (crucial pour forcer l'algorithme à conserver la première ligne d'un groupe selon vos critères de tri).
casOut Spécifie la table de sortie principale . Elle recevra les lignes conservées.
duplicateOut Table optionnelle pour sauvegarder uniquement les lignes éliminées car considérées comme des doublons.
uniqueOut Table optionnelle pour stocker les groupes qui ne contenaient qu'une seule ligne à l'origine (les solitaires).
noDuplicateKeys Booléen. Si `true`, active l'élimination des doublons. Seule la première ligne de chaque groupe est conservée.
noUniqueKeys Booléen. Si `true`, élimine les groupes qui n'ont qu'une seule ligne. Pratique pour isoler et observer uniquement les cas problématiques de votre base de données.
groupByRaw Booléen. Si `true`, le regroupement s'effectue sur la valeur brute des variables, en ignorant les formats SAS appliqués.

Préparation des données

Création d'une table d'historique de commandes

Nous allons créer une table simulant des commandes clients. Certains clients, très fidèles (ou tête en l'air), ont passé plusieurs commandes.

1DATA casuser.commandes;
2 INPUT id_client nom $ montant date_cmd;
3 DATALINES;
4101 Dupont 50 20230101
5101 Dupont 120 20230115
6102 Martin 75 20230105
7103 Durand 200 20230102
8103 Durand 10 20230110
9103 Durand 50 20230120
10;
11RUN;

Exemples d'utilisation

Dédoublonnage basique par identifiant client

Cet exemple élimine les doublons sur la variable `id_client`. L'algorithme ne garde qu'une seule ligne par client dans `cmd_dedoublonnees`, sans que nous ayons forcé le tri.

1PROC CAS;
2 deduplication.deduplicate /
3 TABLE={name="commandes", caslib="casuser", groupBy={"id_client"}}
4 casOut={name="cmd_dedoublonnees", caslib="casuser", replace=true}
5 noDuplicateKeys=true;
6QUIT;
Résultat Attendu :
Une table de sortie contenant 3 lignes (une ligne aléatoire pour Dupont, une pour Martin, une pour Durand).
Conservation intelligente de la commande la plus récente avec sauvegarde des rejets

L'approche la plus recommandée : nous utilisons `orderBy` en descendant sur la date pour garantir que la ligne conservée soit la commande la plus récente. Les anciennes commandes sont poussées dans une table d'archive via `duplicateOut`.

1PROC CAS;
2 deduplication.deduplicate /
3 TABLE={
4 name="commandes",
5 caslib="casuser",
6 groupBy={"id_client"},
7 orderBy={{name="date_cmd", order="DESCENDING"}}
8 }
9 casOut={name="dernieres_commandes", caslib="casuser", replace=true}
10 duplicateOut={name="commandes_archivees", caslib="casuser", replace=true}
11 noDuplicateKeys=true;
12QUIT;
Résultat Attendu :
La table `dernieres_commandes` (3 lignes) contiendra la commande du 15/01 pour Dupont, 05/01 pour Martin et 20/01 pour Durand. La table `commandes_archivees` contiendra les 3 anciennes commandes rejetées.
Filtrage inversé : ne garder que les clients ayant commandé plusieurs fois

Ici, on détourne l'action. Au lieu de dédoublonner, on veut repérer nos clients récurrents. En activant `noUniqueKeys`, on élimine les clients ponctuels (Martin).

1PROC CAS;
2 deduplication.deduplicate /
3 TABLE={name="commandes", caslib="casuser", groupBy={"id_client"}}
4 casOut={name="clients_recurrents", caslib="casuser", replace=true}
5 uniqueOut={name="clients_ponctuels", caslib="casuser", replace=true}
6 noUniqueKeys=true;
7QUIT;
Résultat Attendu :
La table `clients_recurrents` conserve les 5 lignes cumulées de Dupont et Durand. La table `clients_ponctuels` récupère l'unique ligne de Martin.