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
1
A
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
Le vôtre est meilleur pour trouver des reproductions exactes. –
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