ลบรายการที่ซ้ำจาก Spatialite


9

ฉันมีฐานข้อมูล Spatialite พร้อมคะแนน เมื่อเวลาผ่านไปจะมีการเพิ่มคะแนน อะไรจะเป็นวิธีที่ง่ายที่สุดในการลบข้อมูลที่ซ้ำกันตามพิกัด

คำตอบ:


7

การเข้าร่วมตารางอัตโนมัติจะช่วยให้คุณค้นหาแถวที่ซ้ำกัน สิ่งที่ควรทำ:

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

(ไม่ได้ทดสอบ ..... )


2
ขอบคุณที่ทำให้ฉันไปในทิศทางที่ถูกต้องฉันแก้ไขด้วย: ลบจาก mytable2 ที่ geom IN (เลือก geom จาก mytable1);
johannes

8

ฉันคิดว่าวิธีที่ง่ายที่สุดคือการไม่ปล่อยให้สิ่งที่ซ้ำกันเข้ามาเพิ่มข้อ จำกัด ที่ไม่ซ้ำกันในฟิลด์เรขาคณิต ฉันไม่รู้ว่ามันจะทำงานอย่างไรใน spatiallite แต่ใน postgis constrint จะเปรียบเทียบกล่อง bounding ซึ่งจะดำน้ำเอฟเฟกต์ที่ต้องการในกรณีของคะแนน

หากไม่สำคัญว่าจะลบรายการใดรายการหนึ่งคุณสามารถสร้างคิวรีที่ลบแถวทั้งหมดด้วยรหัสที่ไม่พบในแบบสอบถามย่อยซึ่งเลือกรูปทรงเรขาคณิตที่แตกต่างกัน เหมือนกันที่นี่ปลอดภัยด้วยคะแนน แต่ไม่ใช่ประเภทอื่น ๆ เนื่องจากจะเปรียบเทียบเฉพาะ bbox เท่านั้นไม่ใช่เรขาคณิตจริง (หากทำงานในลักษณะเดียวกับ postgis)

/ Nicklas


ขอบคุณสำหรับคำตอบของคุณฉันชอบความคิดที่มีข้อ จำกัด
johannes


0

ในกรณีของฉันวิธีที่มีประสิทธิภาพที่สุดคือการใช้ดัชนีเชิงพื้นที่จากเลเยอร์ ด้วยแบบสอบถามนี้ฉันเก็บรูปทรงเรขาคณิตเพียง 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 )
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.