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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top