【问题标题】:search for cross-field duplicates in postgresql在 postgresql 中搜索跨字段重复项
【发布时间】:2023-03-03 09:30:23
【问题描述】:

我有一张联系人表。该表包含一个 mobile_phone 列以及一个 home_phone 列。我想获取所有重复的联系人,其中重复是两个共享电话号码的联系人。如果联系人 A 的 mobile_phone 与联系人 B 的 home_phone 匹配,则这也是重复的。 这是应该匹配的三个联系人的示例。

contact_id|mobile_phone|home_phone|other columns such as email.......|...
-------------------------------------------------------------------------
111       |9748777777  |1112312312|..................................|...
112       |1112312312  |null      |..................................|...
113       |9748777777  |0001112222|..................................|...

这是一个查找重复项的查询,而不是跨字段。

select mobile_phone from contacts group by mobile_phone HAVING count(*) > 1 order by mobile_phone

【问题讨论】:

  • 您要查找重复的(涉及的行)还是只查找共享的电话号码?

标签: sql postgresql duplicates


【解决方案1】:

使用窗口函数:

select c.*
from (select c.*, count(*) over (partition by mobile_phone) as cnt
      from contacts c
     ) c
where cnt > 1;

【讨论】:

  • 我需要处理跨字段重复
  • @GNG 。 . .这不是您在这里问的问题:“这会返回出现在多行中的所有 mobile_phone 号码。我最终需要整行的内容。”如果您有类似的问题,请提出一个问题,并提供适当的样本数据和所需的结果。
  • 谢谢。我将其作为细节包括在内,以提供问题的背景/动机。
【解决方案2】:

要查找具有(跨列)重复电话号码的所有行:

SELECT *
FROM   contacts c
WHERE  EXISTS (
   SELECT FROM contacts x
   WHERE  x.mobile_phone IN (c.mobile_phone, c.home_phone)
       OR x.home_phone   IN (c.mobile_phone, c.home_phone)
   AND x.contact_id <> c.contact_id  -- except self
   );

要在两列中查找所有重复的电话号码:

SELECT DISTINCT phone
FROM  (
   SELECT mobile_phone AS phone
   FROM   contacts c
   WHERE  EXISTS (
      SELECT FROM mobile_phone x
      WHERE  c.mobile_phone IN (x.mobile_phone, x.home_phone)
      AND    c.contact_id <> x.contact_id  -- except self
      )
   UNION ALL
   SELECT home_phone
   FROM   contacts c
   WHERE  EXISTS (
      SELECT FROM mobile_phone x
      WHERE  c.home_phone = x.home_phone   -- cross-over covered by 1s SELECT
      AND    c.contact_id <> x.contact_id  -- except self
      )
   ) sub;

同一行的两列中重复相同的数字不符合条件。我不认为你会想要包括那些。 (仍然是可能值得用 CHECK 约束禁止的噪音。)

【讨论】:

  • 这很好用。但是如何更新查询以恢复重复联系人的contact_ids?例如 | 其中contact_1 和contact_2 共用一个电话号码?
  • 如果这不可能,如果我们能找回匹配的电子邮件地址,那将几乎同样有用。
  • @GNG 一切皆有可能,但更贵。这个问题要求提供duplicate contacts 或重复的电话号码(如您的查询所暗示的那样。请将您的新问题作为新问题提出。(请明确您对查询的期望。)您可以随时链接到这个以获取上下文并删除在此处发表评论以链接回并引起我的注意。
  • 好的。谢谢你的轻推。我在这里发布了跟进:stackoverflow.com/questions/63293191/…
猜你喜欢
  • 2020-11-27
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
相关资源
最近更新 更多