Beseitigen Sie doppelte Städte aus der Datenbank
-
26-10-2019 - |
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:
- Beseitigen Sie die offensichtlichen Duplikate (gleiche Land, Region und Stadtname), indem Sie die min (ID) entfernen.
- 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!
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.