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:

  1. Éliminer les doublons évidents (même pays, la région et le nom de la ville) en supprimant le min (id).
  2. É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!

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top