Supprimer les doublons d'un fichier intermédiaire
-
03-07-2019 - |
Question
J'ai une table de transfert qui contient une série de lignes de données who extraites d'un fichier de données.
Chaque ligne décrit en détail une modification apportée à une ligne d'un système distant. Ces lignes sont en réalité des instantanés de la ligne source prise après chaque modification. Chaque ligne contient des horodatages de métadonnées pour la création et les mises à jour.
J'essaie maintenant de créer une table de mise à jour à partir de ces fichiers de données contenant la totalité de la mise à jour. J'ai besoin d'un moyen de supprimer les lignes avec des clés en double en conservant uniquement la ligne avec la dernière "mise à jour". horodatage.
Je suis conscient que je peux utiliser le SSIS "tri". transformer pour supprimer les doublons en triant sur le champ clé et en lui disant de supprimer les doublons, mais comment puis-je m'assurer que la ligne qu'elle garde est celle portant le dernier horodatage?
La solution
Ceci supprimera les lignes avec correspondance sur Col1, Col2, etc. et aura une mise à jour qui n'est PAS la plus récente:
DELETE D
FROM MyTable AS D
JOIN MyTable AS T
ON T.Col1 = D.Col1
AND T.Col2 = D.Col2
...
AND T.UpdateDate > D.UpdateDate
Si Col1 et Col2 doivent être considérés comme "correspondants" si elles sont toutes les deux NULL, vous devez utiliser:
ON (T.Col1 = D.Col1 OR (T.Col1 IS NULL AND D.Col1 IS NULL))
AND (T.Col2 = D.Col2 OR (T.Col2 IS NULL AND D.Col2 IS NULL))
...
Modifier : si vous devez effectuer un test Case Sensitive sur une base de données Case IN , utilisez les colonnes VARCHAR et TEXT:
ON (T.Col1 = D.Col1 COLLATE Latin1_General_BIN
OR (T.Col1 IS NULL AND D.Col1 IS NULL))
...
Autres conseils
Vous pouvez utiliser la transformation de tri dans SSIS pour trier votre jeu de données en plusieurs colonnes. Il suffit de trier votre clé primaire (ou champ ID) suivi de votre colonne d'horodatage par ordre décroissant.
Voir l'article suivant pour plus de détails sur l'utilisation du tri Transformation?
http://msdn.microsoft.com/en-us/library /ms140182.aspx
Avez-vous du sens?
À la vôtre John
Est-il judicieux d’ignorer les doublons lors du passage de la table intermédiaire à la table finale?
Vous devez le faire quand même, alors pourquoi ne pas lancer une requête sur la table de transfert plutôt que deux?
INSERT final
(key, col1, col2)
SELECT
key, col1, col2
FROM
staging s
JOIN
(SELECT key, MAX(datetimestamp) maxdt FROM staging ms ON s.key = ms.key AND s.datetimestamp = ms.maxdt