【问题标题】:Postgres table : Find duplicates in two columns, regardless of orderPostgres表:在两列中查找重复项,无论顺序如何
【发布时间】:2012-06-15 08:35:27
【问题描述】:

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

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

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

谢谢:)

【问题讨论】:

  • 在这种情况下,我至少可以通过两种可能的方式来设想复制。 1).Lines 表包含一条指向 point_id(1), point_id(2) 的记录和一条指向 point_id(2), point_id(1) 的记录。 2. 这两行都有不同的point_id 值,但是当你查看point 表时,不同的point_id 可以有相同的坐标。能否举例说明一下?
  • 感谢您的评论。重复项在 point_ids 中,而不是在坐标中,所以这是您问题的第一种情况。而且,所有的行都是重复的,每一个AB行都有一个BA行,这是建表算法的结果。

标签: sql postgresql duplicates aggregate-functions


【解决方案1】:

识别重复项:

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

(未测试!)

【讨论】:

  • 嗯...现在在我看来,这将删除的不仅仅是重复记录
  • @LaurentJégou - 这将删除任何有重复行的每条记录;如果一行存在a,b AND b,a,则两条记录都将被删除。它只需要有WHERE (a,b) IN ( 然后它只会删除a<b 所在行的实例。然后假设任何具有重复项的行都作为a,bb,a 存在,并且还假设没有行会有多个a,b 条目(因此删除所有b,a 条目就足够了)。在这种情况下,它在功能上与我的答案非常相似,但有一点额外的复杂性;)
  • 我同意 Dems 的评论,我使用了“where (a, b) in”版本,它只删除了重复项。
  • @LaurentJégou - 在这种情况下,我认为这有点过于复杂,因为它表现出与我更简单的答案相同的行为(和假设)。尽管我没有测试过,但我希望这个答案也会比更简单的答案更慢(更多 cpu,更多读取)。
【解决方案2】:

我已发表评论,但我现在假设两个 duplicate 记录之间的唯一区别是它们具有相同的 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 假设唯一的重复项交换了 a,b ,这将起作用。如果有多行具有相同的a,b,它将不起作用
  • @Andomar - 正确,这就是我提出这样一个假设的原因 :) 但是,有趣的是,接受的答案似乎都是不正确的(删除所有出现的,而不仅仅是重复的),即使更正也会使几乎与我的答案相同的假设。 (请参阅我对答案的评论。)
猜你喜欢
  • 2019-04-01
  • 2019-10-02
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 2017-12-27
相关资源
最近更新 更多