2010-12-10 6 views
1

J'ai besoin d'interroger une table pour des enregistrements de dépôt en double, où deux dépôts effectués sur un même terminal, pour le même montant, dans une certaine fenêtre temporelle, sont considérés comme des enregistrements en double. J'ai commencé à travailler sur une requête maintenant, mais j'apprécierais tous les conseils ou suggestions pour le faire correctement.Recherche efficace pour trouver des enregistrements en double

Répondre

2

En général, vous feriez une auto se joindre à la même table, et de mettre votre « double » critères dans les conditions de jointure.

E.g.

SELECT 
    * 
FROM 
    Transactions t1 
     inner join 
    Transactions t2 
     on 
      t1.Terminal = t2.Terminal and 
      t1.Amount = t2.Amount and 
      DATEDIFF(minute,t2.TransactionDate,t1.TransactionDate) between 0 and 10 and 
      t1.TransactionID > t2.TransactionID /* prevent matching the same row */ 
2

simple agrégat

SELECT 
    col1, col2, col3, ... 
FROM 
    MyTable 
GROUP BY 
    col1, col2, col3, ... 
HAVING 
    COUNT(*) >= 2 

Ne pas inclure votre identité/clé/colonne PK: ce sera unique par ligne et gâcher l'ensemble.

Pour obtenir une ligne pour supprimer ou conserver, faire un MAX ou MIN sur ce

SELECT 
    col1, col2, col3, ..., 
    MAX(IDCol) AS RowToDelete, 
    MIN(IDCol) AS RowToKeep 
FROM 
    MyTable 
GROUP BY 
    col1, col2, col3, ... 
HAVING 
    COUNT(*) >= 2 

Bien sûr, avec 3 doubles puis faire un « garder ».

Edit:

Pour les lignes dans une fenêtre de temps, utilisez une jointure réflexive ou fenêtre/classement fonction

+0

Le vôtre est meilleur pour trouver des reproductions exactes. –

+0

Merci, mais de regrouper sur la différence entre les temps de dépôt de deux enregistrements s'avérera difficile. @Damien_The_Unbeliever a une requête plus flexible. – ProfK

Questions connexes