requête sql pour supprimer une seule ligne en double
J'ai une table avec des lignes en double dans il. Je veux supprimer une seule ligne en double.
Par exemple, j'ai réussit à 9 lignes en double donc préférable de supprimer une seule ligne et afficher les 8 lignes restantes.
exemple
date appelant appelé durée timestampp
2012-06-19 10:22:45.000 165 218 155 1.9 121
2012-06-19 10:22:45.000 165 218 155 1.9 121
2012-06-19 10:22:45.000 165 218 155 1.9 121
2012-06-19 10:22:45.000 165 218 155 1.9 121
partir de la date ci-dessus devrait supprimer une seule ligne et afficher 3 lignes
2012-06-19 10:22:45.000 165 218 155 1.9 100
2012-06-19 10:22:45.000 165 218 155 1.9 100
2012-06-19 10:22:45.000 165 218 155 1.9 100
partir de la date ci-dessus devrait supprimer une seule ligne et devrait afficher 2 lignes
Comment puis-je faire cela?
- pouvez vous s'il vous plaît formater les données il est donc plus readble?
- Il y a cinq noms de colonnes listées, mais six colonnes en sortie. Et comment fonctionne la dernière colonne changement de 121 à 100? Si la source avait deux rangées avec 121 et deux lignes avec 100, voulez-vous supprimer les deux lignes ou un seul? (En d'autres mots, est double basé sur la date de seul?)
Vous devez vous connecter pour publier un commentaire.
Cette solution vous permet de supprimer une ligne de chaque ensemble de doublons (plutôt que de simplement la manipulation d'un seul bloc de doublons à la fois):
En aparté, à la fois
[date]
et[timestamp]
sont des choix terribles pour les noms de colonne...Pour SQL Server 2005+ vous pouvez effectuer les opérations suivantes:
Avez-vous une clé primaire sur la table?
Ce qui fait une ligne d'un duplicata? Même temps? même date? toutes les colonnes de la même chose?
Si vous avez une clé primaire, vous pouvez utiliser la fonction SUPÉRIEURE pour sélectionner un seul enregistrement et supprimer une ligne:
Si vous n'avez pas l'esprit de l'ordre de ces lignes il y a une commande MySQL:
Puisque je n'ai pas le schéma, je ferais une solution possible dans les étapes:
Edit:
La rownumber est dans une requête interne et aura le rownumber incrémentation dans toutes les lignes. Dans la requête externe je faire de ce groupe par l'intérieur de la requête et sélectionnez le min(rownumber) pour chaque groupe. Puisque chaque groupe est constitué par les lignes en double, j'ai ensuite supprimer le min(rownumber) pour chaque groupe.
à l'aide de
LIMIT 1
vous aidera à supprimer uniquement1 ROW
qui correspond à votreDELETE
requête:AVANT:
APRÈS: