Setelah - Saya tidak tahu apa yang terjadi - semua entri saya di tabel PostGIS saya digandakan! Saya mencoba ini untuk menghapusnya tetapi tidak menghapus semua / semua duplikat:
DELETE FROM planet_osm_point
WHERE osm_id NOT IN (SELECT min(osm_id)
FROM planet_osm_point
GROUP BY osm_id)
atau ini:
DELETE FROM planet_osm_point
WHERE osm_id NOT IN (
select max(dup.osm_id)
from planet_osm_point as dup
group by way);
EDIT:
Saya akhirnya menemukan cara mudah, yang berfungsi dalam kasus saya:
DELETE FROM planet_osm_point WHERE ctid NOT IN
(SELECT max(ctid) FROM planet_osm_point GROUP BY osm_id);
ditemukan di halaman ini: http://technobytz.com/most-useful-postgresql-commands.html
planet_osm_point
struktur tabel saat ini? berarti jenis kolom. Anda dapat menulis kode Python dasar untuk mengumpulkan kolom yang dipilih, jika mengalami kesulitan dengan fungsi SQL.ctid
pendekatan ini . Kolom ini telah ditambahkan secara manual setelah acara duplikasi?Jawaban:
Salah satu cara untuk melakukan ini, adalah dengan menggunakan fungsi jendela dan partisi berdasarkan geometri, sehingga setiap geometri yang diulang mendapatkan id: 1, 2, 3, dll (atau 1, 2) dalam kasus Anda, dan kemudian Anda tinggal memilih dari tabel tempat id = 1, untuk mendapatkan set nilai yang unik (atribut dan geometri) kembali, misalnya,
Jelas, Anda perlu menambahkan kolom osm lainnya di pilih juga, ini hanya untuk ilustrasi, tetapi ini pada dasarnya seperti pengelompokan berdasarkan geometri dan hanya memilih contoh pertama masing-masing. Catatan, Anda perlu menggunakan ST_AsBinary di Partisi Oleh karena jika tidak, perbandingan dilakukan pada kotak pembatas, bukan geometri yang sebenarnya.
Karena semua atribut lainnya mungkin sama untuk setiap pasangan geometri, Anda akan melakukannya seperti ini untuk semua bidang lainnya, termasuk osm_id, dan untuk benar-benar membuat tabel baru dan unik:
Ini mungkin lebih cepat daripada menghapus dari tabel yang ada, terutama jika ada banyak indeks di tempat.
EDIT . Ditulis ulang untuk keterbacaan, tetapi, meninggalkan kredit untuk dbaston karena menarik perhatian saya ke ST_AsBinary (geom)
sumber
Partition By
?PARTITION BY
menggunakan=
operator, yang bekerja pada kesetaraan kotak pembatas). Saya sarankan mengubah di atasPARTITION BY ST_AsBinary(geom)
sebagai perbaikan.Berikut adalah metode lain yang saya gunakan untuk menghapus duplikat dari unduhan data tanah SSURGO. Shapefile yang diunduh tidak memiliki kunci unik, sehingga kolom pk serial dihasilkan ketika saya mengimpor ke PostGIS. Ada beberapa tumpang tindih dalam set data, dan saya secara tidak sengaja mengimpor beberapa catatan lebih dari sekali saat mengembangkan skrip impor.
Grup dengan pernyataan termasuk semua kolom dalam tabel, tidak termasuk kunci utama.
Ini hanya akan menghapus satu set duplikat baris setiap kali dijalankan, jadi jika satu baris diulang 4 kali Anda harus menjalankan ini minimal 3 kali. Ini kemungkinan tidak secepat solusi John, tetapi bekerja dalam tabel yang ada. Ini juga berfungsi ketika Anda tidak memiliki id unik untuk setiap geometri unik (seperti osm_id dalam pertanyaan asli).
Saya menggunakan skrip python untuk mengulang sampai duplikat hilang, dan kemudian menjalankan kekosongan penuh. Saya pikir skrip dan vakum masing-masing memakan waktu sekitar 30 menit untuk beberapa ratus ribu duplikat dari sekitar 1,5 juta catatan dalam 6 tabel. Sangat bagus untuk sekali saja. Ia melewati meja-meja kecil dengan sangat cepat.
EDIT: SQL dimodifikasi untuk menghindari menjalankan beberapa kali berdasarkan saran @daston (di bawah). Saya mencoba metode kueri ini pada tabel besar (~ 1,5 juta catatan, ~ 25.000 baris titik duplikat), dan setelah berjalan selama 45 menit, saya membatalkan eksekusi. Berjalan dengan SQL di atas (menggunakan subquery yang lebih kecil dari HAVING COUNT) mengurangi setiap proses hingga kurang dari 30 detik. Setelah berjalan 3 kali, itu dilakukan dengan semua duplikat. SQL di bawah ini harus OK untuk tabel kecil.
sumber
ctid
(lihat dokumen ).primary_key NOT IN (SELECT max(primary_key) ....
Jawaban yang lebih umum untuk dengan mudah menghapus duplikat geometri di tabel PostGIS. Perintah berikut menghapus semua fitur dengan duplikat geometri di "table_name" berdasarkan kunci primer (kolom "gid") dan persamaan geometri (kolom "geom"). Sadarilah itu benar-benar menghapus semua duplikat geometri, mereka akan hilang, selamanya! Mungkin kembali dulu?
sumber