J'ai une table avec des rangées. Chaque rangée a un champ de date. À l'heure actuelle, cela peut être duplicate d'une date. J'ai besoin de supprimer tous les doublons et de stocker uniquement la ligne avec le plus haut identifiant MAINTENANT: P> code>. Comment cela est-ce possible à l'aide d'une requête SQL? date id
'07/07' 3
'07/05' 5
3 Réponses :
DELETE FROM table WHERE id NOT IN
(SELECT MAX(id) FROM table GROUP BY date);
Wow, est-ce que je suis allé un chemin de rond-point ou quoi? C'est certainement le meilleur moyen de le faire.
Je pensais que votre chemin était un peu trop compliqué ... mais honnêtement, je voulais le faire d'abord en utilisant 3 requêtes au lieu de celui-ci.
Cette requête est également utile pour cette réponse: Sélectionnez la date, le compte (date) comme numomocurrences de groupe de table par date ayant (date (date)> 1)
@djangofan: Presque, vous devez simplement sélectionner ID au lieu de compter (date).
Cela ne fonctionnerait toutefois pas dans MySQL en raison de ses limitations stupides sur les sous-sélectionneurs.
En fonction de vos données, cette requête peut prendre beaucoup plus de temps que celle suggérée par IDDQD.
Pour MySQL, PostgreSQL, Oracle Metter Way est auto-jointure. Agrégation SQL (Max, groupe par) Les fonctions sont presque toujours très lentes. P> P>
Je n'ai pas de droits de commentaire, alors voici mon commentaire comme une réponse au cas où n'importe qui apparaît dans le même problème:
dans SQLite3, il existe une clé primaire numérique implicite appelée "Rowid", de sorte que la même requête serait la même requête. ressemblent à ceci: p> Cela fonctionnera avec n'importe quelle table même s'il ne contient pas une colonne de clé primaire appelée "ID". P> P>
À partir des données que vous avez envoyées, vous vous retrouvez avec deux pas trois rangées! 07/05 est répété.