J'ai déjà 80 millions d'enregistrements insérés dans une table, mais je dois m'assurer que quelques colonnes sont communes. Cependant, les colonnes contiennent déjà des données non uniques, donc ALTER TABLE ne fonctionne pas. Je voudrais une requête qui me permette de supprimer facilement des enregistrements non uniques, en conservant l'un d'entre eux, ou un qui me permettra de charger les données de la table en cours dans une nouvelle, tout en filtrage pour l'unicité.Application de l'unicité sur une colonne de table PostgreSQL après l'insertion de valeurs non uniques
Répondre
La requête que vous cherchez est:
select distinct on (my_unique_1, my_unique_2) * from my_table;
Cette sélectionne une ligne pour chaque combinaison de colonnes dans les distinct on
. En fait, c'est toujours la première ligne. Il est rarement utilisé sans order by
puisqu'il n'y a pas d'ordre fiable dans lequel les lignes sont retournées (et donc quelle est la première).
Combiné avec order by
vous pouvez choisir quelles lignes sont la première (ce qui laisse les lignes avec le plus grand last_update_date):
select distinct on (my_unique_1, my_unique_2) *
from my_table order by my_unique_1, my_unique_2, last_update_date desc;
Maintenant, vous pouvez sélectionner ceci dans une nouvelle table:
create table my_new_table as
select distinct on (my_unique_1, my_unique_2) *
from my_table order by my_unique_1, my_unique_2, last_update_date desc;
Ou vous pouvez l'utiliser pour supprimer, en supposant que row_id
est une clé primaire:
delete from my_table where row_id not in (
select distinct on (my_unique_1, my_unique_2) row_id
from my_table order by my_unique_1, my_unique_2, last_update_date desc);
+1 DISTINCT ON est une fonctionnalité PostgreSQL très pratique – leonbloy
A propos de "la première ligne": Sans ORDER BY, il n'y a aucun moyen de dire quelle ligne reviendra en premier, donc la "première ligne" est un terme trompeur comme vous pouvez pas toujours le même résultat. Un DISTINCT ON est pratiquement inutile sans clause ORDER BY. –
Merci, mis à jour pour rendre cela plus explicite. –
- 1. Obtention de valeurs uniques inutilisées dans une table SQL
- 2. Suppression de données non uniques sur l'insertion
- 3. Génération de valeurs uniques
- 4. Héritage de table: application de contraintes uniques sur des partitions?
- 5. Postgresql Table de modification
- 6. SharePoint: Valeurs de colonnes uniques
- 7. Tri de la table de hachage par des valeurs (éventuellement non uniques)
- 8. Utilisation de noms de variables dynamiques uniques (valeurs non variables!)
- 9. Comment mettre à jour des valeurs uniques dans SQL en utilisant une séquence PostgreSQL?
- 10. Comment modifier une table PostgreSQL et rendre une colonne unique?
- 11. SQL: filtre sur une combinaison de deux valeurs de colonne
- 12. Flex CategoryAxis avec des valeurs non uniques
- 13. Lecture des valeurs de table par colonne
- 14. Cas particulier de mise à jour d'une colonne avec des contraintes non nulles et uniques dans PostgreSQL
- 15. jQuery: Trier une colonne de table non rangée
- 16. Valeurs de colonne jquery sur clic
- 17. Échange de valeurs de colonne indexées uniques dans la base de données
- 18. CoreData - Valeurs uniques de subEntity ....?
- 19. Puis-je ajouter une contrainte UNIQUE à une table PostgreSQL, après qu'elle a déjà été créée?
- 20. MySQL: Puis-je contraindre les valeurs de colonne d'une table à des valeurs dans une colonne d'une autre table, par conception de base de données uniquement?
- 21. PostgreSQL créer une syntaxe de table
- 22. PostgreSQL: valeurs de ligne dynamiques (?)
- 23. prépondérants valeurs indexées uniques
- 24. Valeurs de colonnes dupliquées dans une table
- 25. Reporting Services extrait des valeurs uniques de jeu de données
- 26. distincte sur une seule colonne, mais renvoyant une ligne de la même table basée sur une condition non sélectionnée
- 27. Obtention de lignes/valeurs uniques dans SQL
- 28. Fluent nHibernate - Comment mapper une colonne non-clé sur une table de jonction?
- 29. PostgreSQL lente sur une grande table avec des tableaux et beaucoup de mises à jour
- 30. Comment ajouter une colonne non null à la table postgresql sans doubler sa taille sur le disque
Avez-vous un critère pour choisir la ligne à conserver et celle à rejeter lorsque l'unicité est violée pour ces colonnes? –
Oui, une colonne de date. Je garderais les enregistrements les plus récents. Si ceux-ci sont également en double pour une raison quelconque, l'un ou l'autre peut y aller. – ehsanul