Postgres表:无论顺序如何,都可以在两列中查找重复项

时间:2012-06-12 12:51:47

标签: sql postgresql duplicates aggregate-functions

我有一个描述两点之间的线的PostgreSQL表。它包含两列,A和B,表示点的id的整数(在另一个表中描述)。

但是每一行都在表格中重复,因为从A到B的行与从B到A的行相同。

我想删除重复项,但我找不到在两列上工作的聚合函数,重新组合AB和BA行然后删除一列。

谢谢:)

2 个答案:

答案 0 :(得分:7)

识别重复项:

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);

(未经测试!)

答案 1 :(得分:2)

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