ฉันมีฐานข้อมูล Spatialite พร้อมคะแนน เมื่อเวลาผ่านไปจะมีการเพิ่มคะแนน อะไรจะเป็นวิธีที่ง่ายที่สุดในการลบข้อมูลที่ซ้ำกันตามพิกัด
ฉันมีฐานข้อมูล Spatialite พร้อมคะแนน เมื่อเวลาผ่านไปจะมีการเพิ่มคะแนน อะไรจะเป็นวิธีที่ง่ายที่สุดในการลบข้อมูลที่ซ้ำกันตามพิกัด
คำตอบ:
การเข้าร่วมตารางอัตโนมัติจะช่วยให้คุณค้นหาแถวที่ซ้ำกัน สิ่งที่ควรทำ:
DELETE t1
FROM mytable t1, mytable t2
WHERE t1.the_geom = t2.the_geom
ถ้าคะแนน:
DELETE t1
FROM mytable t1, mytable t2
WHERE t1.x = t2.x
AND t1.y > t2.y
(ไม่ได้ทดสอบ ..... )
ฉันคิดว่าวิธีที่ง่ายที่สุดคือการไม่ปล่อยให้สิ่งที่ซ้ำกันเข้ามาเพิ่มข้อ จำกัด ที่ไม่ซ้ำกันในฟิลด์เรขาคณิต ฉันไม่รู้ว่ามันจะทำงานอย่างไรใน spatiallite แต่ใน postgis constrint จะเปรียบเทียบกล่อง bounding ซึ่งจะดำน้ำเอฟเฟกต์ที่ต้องการในกรณีของคะแนน
หากไม่สำคัญว่าจะลบรายการใดรายการหนึ่งคุณสามารถสร้างคิวรีที่ลบแถวทั้งหมดด้วยรหัสที่ไม่พบในแบบสอบถามย่อยซึ่งเลือกรูปทรงเรขาคณิตที่แตกต่างกัน เหมือนกันที่นี่ปลอดภัยด้วยคะแนน แต่ไม่ใช่ประเภทอื่น ๆ เนื่องจากจะเปรียบเทียบเฉพาะ bbox เท่านั้นไม่ใช่เรขาคณิตจริง (หากทำงานในลักษณะเดียวกับ postgis)
/ Nicklas
DELETE FROM foo
WHERE pkuid NOT IN (SELECT min(pkuid) --or max(pkuid)
FROM foo
GROUP BY geometry)
(นำมาจากคำตอบของDenis Valeevที่นี่: /programming/3777633/delete-duplicate-rows-dont-delete-all-duplicate )
ในกรณีของฉันวิธีที่มีประสิทธิภาพที่สุดคือการใช้ดัชนีเชิงพื้นที่จากเลเยอร์ ด้วยแบบสอบถามนี้ฉันเก็บรูปทรงเรขาคณิตเพียง 1 อันสำหรับแต่ละคุณลักษณะที่ทับซ้อนกัน ฉันทำการทดสอบด้วย TIN ที่แปลงเป็น Linestring
delete from tin_line_sp where ogc_fid not in (
select min(s1.rowid) as id_to_keep from
idx_tin_line_sp_geometry as s1,
idx_tin_line_sp_geometry as s2
where
s1.xmin = s2.xmin and
s1.xmax = s2.xmax and
s1.ymin = s2.ymin and
s1.ymax = s2.ymax
group by s1.xmin,s1.xmax,s1.ymin,s1.ymax)
เพื่อให้เข้าใจดัชนีอวกาศอย่างถูกต้องต่อไปนี้เป็นสองแบบสอบถามเพื่อแปลงดัชนีเชิงพื้นที่เป็นรูปหลายเหลี่ยม
create table tin_line_sp_representation as
select PolygonFromText('POLYGON(('||
xmin || ' ' || ymin || ',' ||
xmax || ' ' || ymin || ',' ||
xmax || ' ' || ymax || ',' ||
xmin || ' ' || ymax || ',' ||
xmin || ' ' || ymin || '))',25832) as geometry
from idx_tin_line_sp_geometry;
ในความสำเร็จให้กู้คืนคอลัมน์รูปทรงเรขาคณิตเพื่อให้สามารถมองเห็นเป็นมุมมองที่คุณชื่นชอบ:
select RecoverGeometryColumn( 'tin_line_sp_representation','geometry', 25832 , 'POLYGON', 2 )