Frage

Hintergrund

Über 5300 doppelte Zeilen:

"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"

Weitere Details:

  • Postgresql 8.4 Datenbank
  • Linux

Problem

Einige Werte sind offensichtliche Duplikate ("Abay", weil die Regionen übereinstimmen und "AB Barik" übereinstimmen, da die beiden Standorte in einer solchen Nähe befinden), andere sind nicht so offensichtlich (und sind möglicherweise nicht einmal tatsächliche Duplikate):

"1919430","27.4263889","57.5725","IR","29","`Abbasabad"
"1919435","36.5641667","61.14","IR","30","`Abbasabad"

Ziel ist es, alle Duplikate zu beseitigen.

Fragen

Bei einer Werte Tabelle wie den oben genannten CSV -Daten angegeben:

  • Wie würden Sie Duplikate beseitigen?
  • Welche geo-zentrierten Postgresql-Funktionen würden Sie verwenden?
  • Mit welchen anderen Kriterien würden Sie die Duplikate niederschlagen?

Aktualisieren

Semi-Working-Beispielcode zur Auswahl doppelter Stadtnamen in demselben Land, das in unmittelbarer Nähe (innerhalb von 10 km) ist:

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

Ideen

Zwei -Phasen -Ansatz:

  1. Beseitigen Sie die offensichtlichen Duplikate (gleiche Land, Region und Stadtname), indem Sie die min (ID) entfernen.
  2. Beseitigen Sie diejenigen in unmittelbarer Nähe voneinander und haben den gleichen Namen und denselben Land. Dies könnte einige legitime Städte entfernen, aber kaum eine Konsequenz.

Vielen Dank!

War es hilfreich?

Lösung 2

Dies löscht die zweite Stadt in unmittelbarer Nähe zu einer gleichnamigen Stadt im selben Land:

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
)

Andere Tipps

Duplikate zu finden ist einfach:

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;

Das Hinzufügen von Code, um Duplikate basierend darauf zu entfernen, ist einfach:

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
)

Beachten Sie das Fehlen der Löschabfrage.

Wenn Ihre Daten durch CSV -Dateien und mit dem Code (PHP) importiert wurden, können Sie einen Duplikateintrag mit dem Put -Zustand im PHP -Code verhindern. Wenn die von Ihnen eingefügte Stadt bereits vorhanden ist, dann machen Sie die Schleife fort und überspringen Sie den aktuellen Datensatz.

Versuchen Sie dies, wenn Sie auf diese Weise folgen, um Daten in der Datenbank zu importieren.

Vielen Dank.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top