我有一个 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);
(未经测试!)
我留下了评论,但我现在假设两个重复记录之间的唯一区别是它们具有相同的 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
)