我有一个描述两点之间线条的PostgreSQL表格。它包含两列A和B,这些整数表示另一个表格中点的id。
但是每条线在表格中都是重复的,因为从A到B的线与从B到A的线是相同的。
我想要去除重复项,但我找不到适用于两列的聚合函数,以重新组合AB和BA线,然后删除其中一条。
谢谢 :)
我有一个描述两点之间线条的PostgreSQL表格。它包含两列A和B,这些整数表示另一个表格中点的id。
但是每条线在表格中都是重复的,因为从A到B的线与从B到A的线是相同的。
我想要去除重复项,但我找不到适用于两列的聚合函数,以重新组合AB和BA线,然后删除其中一条。
谢谢 :)
识别重复项:
select least(a,b), greatest(a,b), count(*)
from the_table
group by least(a,b), greatest(a,b)
having count(*) > 1
我认为您应该能够使用以下方式之一删除其中一个配对:
delete from the_table
where (least(a,b), greatest(a,b)) in (
select least(a,b), greatest(a,b)
from the_table
group by least(a,b), greatest(a,b)
having count(*) > 1);
(未经过测试!)
WHERE(a,b)IN(
,然后它将仅删除其中a <b
的行的实例。这就假定任何具有重复项的行都存在于a,b
和b,a
中,并且还假定没有一行将具有多个a,b
条目*(因此删除所有b,a
条目将足够)*。在这种情况下,它在功能上与我的答案非常相似,但稍微复杂一些。;) - MatBailie我已经留下了评论,但现在我假设两个重复记录之间唯一的区别是它们具有相同的point_id值,但是顺序相反。
如果是这样,那么实际上做起来非常简单...
DELETE
line
WHERE
point_id_a > point_id_b
AND EXISTS (SELECT *
FROM line AS lookup
WHERE lookup.point_id_a = line.point_id_b
AND lookup.point_id_b = line.point_id_a
)
1).
***Lines
表包含一个指向point_id(1), point_id(2)
的记录,也包含一个指向point_id(2), point_id(1)
的记录。***2.
*** 当你查看point
表时,这两条线都具有不同的point_id
值,但是不同的point_id
可以具有相同的坐标。你能举个例子来澄清吗? - MatBailie