Éliminer les doublons villes de base de données
-
26-10-2019 - |
Question
Arrière-plan
Plus de 5300 lignes en double:
"id","latitude","longitude","country","region","city"
"2143220","41.3513889","68.9444444","KZ","10","Abay"
"2143218","40.8991667","68.5433333","KZ","10","Abay"
"1919381","33.8166667","49.6333333","IR","34","Ab Barik"
"1919377","35.6833333","50.1833333","IR","19","Ab Barik"
"1919432","29.55","55.5122222","IR","29","`Abbasabad"
"1919430","27.4263889","57.5725","IR","29","`Abbasabad"
"1919413","28.0011111","58.9005556","IR","12","`Abbasabad"
"1919435","36.5641667","61.14","IR","30","`Abbasabad"
"1919433","31.8988889","58.9211111","IR","30","`Abbasabad"
"1919422","33.8666667","48.3","IR","23","`Abbasabad"
"1919420","33.4658333","49.6219444","IR","23","`Abbasabad"
"1919438","33.5333333","49.9833333","IR","34","`Abbasabad"
"1919423","33.7619444","49.0747222","IR","24","`Abbasabad"
"1919419","34.2833333","49.2333333","IR","19","`Abbasabad"
"1919439","35.8833333","52.15","IR","35","`Abbasabad"
"1919417","35.9333333","52.95","IR","17","`Abbasabad"
"1919427","35.7341667","51.4377778","IR","26","`Abbasabad"
"1919425","35.1386111","51.6283333","IR","26","`Abbasabad"
"1919713","30.3705556","56.07","IR","29","`Abdolabad"
"1919711","27.9833333","57.7244444","IR","29","`Abdolabad"
"1919716","35.6025","59.2322222","IR","30","`Abdolabad"
"1919714","34.2197222","56.5447222","IR","30","`Abdolabad"
Détails supplémentaires:
- PostgreSQL 8.4 Base de données
- Linux
Problème
Certaines valeurs sont des doublons évidentes ( « Abay » parce que les régions correspondent et « Ab Barik » parce que les deux sites se trouvent à une telle proximité), d'autres ne sont pas si évidentes (et pourraient même ne pas être des doublons réels):
"1919430","27.4263889","57.5725","IR","29","`Abbasabad"
"1919435","36.5641667","61.14","IR","30","`Abbasabad"
Le but est d'éliminer tous les doublons.
Questions
Étant donné un tableau de valeurs telles que les données de CSV ci-dessus:
- Comment voulez-vous éliminer les doublons?
- Qu'est-ce que géocentrique fonctions de PostgreSQL utiliseriez-vous?
- Quels autres critères utiliseriez-vous pour enjôler les doublons en bas?
Mise à jour
Code exemple semi-travail pour sélectionner les noms de ville en double dans le même pays qui sont à proximité (moins de 10 km):
select
c1.country, c1.name, c1.region_id, c2.region_id, c1.latitude_decimal, c1.longitude_decimal, c2.latitude_decimal, c2.longitude_decimal
from
climate.maxmind_city c1,
climate.maxmind_city c2
where
c1.country = 'BE' and
c1.id <> c2.id and
c1.country = c2.country and
c1.name = c2.name and
(c1.latitude_decimal <> c2.latitude_decimal or c1.longitude_decimal <> c2.longitude_decimal) and
earth_distance(
ll_to_earth( c1.latitude_decimal, c1.longitude_decimal ),
ll_to_earth( c2.latitude_decimal, c2.longitude_decimal ) ) <= 10
order by
country, name
Idées
Approche en deux phases:
- Éliminer les doublons évidents (même pays, la région et le nom de la ville) en supprimant le min (id).
- Éliminer les à proximité les uns des autres, ayant le même nom et le pays. Cela pourrait supprimer certaines villes légitimes, mais pratiquement aucune conséquence.
Merci!
La solution 2
supprime la deuxième ville à proximité d'une ville du même nom dans le même pays:
delete from climate.maxmind_city mc where id in (
select
max(c1.id)
from
climate.maxmind_city c1,
climate.maxmind_city c2
where
c1.id <> c2.id and
c1.country = c2.country and
c1.name = c2.name and
earth_distance(
ll_to_earth( c1.latitude_decimal, c1.longitude_decimal ),
ll_to_earth( c2.latitude_decimal, c2.longitude_decimal ) ) <= 35
group by
c1.country, c1.name
order by
c1.country, c1.name
)
Autres conseils
Trouver des doublons est simple:
select
max(id) as this_should_stay,
latitude,
longitude,
country,
region,
city
FROM
your_table
group by
latitude,
longitude,
country,
region,
city
having count(*) > 1;
Ajout de code pour supprimer les doublons en fonction de c'est simple:
delete from your_table where id not in (
select
max(id) as this_should_stay
FROM
your_table
group by
latitude,
longitude,
country,
region,
city
)
note le manque d'avoir dans la requête de suppression.
si vos données ont été importées à travers des fichiers CSV et avec le code (PHP), vous pouvez empêcher l'entrée de doublons avec la condition de mettre dans le code PHP. si la ville est que vous avez inséré existe déjà faire alors continuer la boucle à l'enregistrement suivant et sauter enregistrement en cours.
essayer si vous êtes suivre cette voie pour importer des données dans la base de données ..
Merci.