deduplicate
Description
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.
Paramètres Clé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.
| 1 | DATA casuser.commandes; |
| 2 | INPUT id_client nom $ montant date_cmd; |
| 3 | DATALINES; |
| 4 | 101 Dupont 50 20230101 |
| 5 | 101 Dupont 120 20230115 |
| 6 | 102 Martin 75 20230105 |
| 7 | 103 Durand 200 20230102 |
| 8 | 103 Durand 10 20230110 |
| 9 | 103 Durand 50 20230120 |
| 10 | ; |
| 11 | RUN; |
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.
| 1 | PROC 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; |
| 6 | QUIT; |
Résultat Attendu :
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`.
| 1 | PROC 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; |
| 12 | QUIT; |
Résultat Attendu :
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).
| 1 | PROC 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; |
| 7 | QUIT; |