【问题标题】:How do I account for count discrepancy in SELECT DISTINCT?如何解决 SELECT DISTINCT 中的计数差异?
【发布时间】:2020-07-05 06:20:07
【问题描述】:

我认为这甚至不是一个 SQL 问题,我只是在逻辑上挣扎,并且可能有一个愚蠢的时刻。

我正在尝试查找表 cms 中存在但表 cm 中不存在的电子邮件地址的数量。我正在使用 postgres 10.4。两个表都包含一个 varchar 列,“email”。

这两个查询都返回 18309 的计数:

SELECT COUNT(DISTINCT email) FROM cms;
SELECT COUNT(email) FROM cms;

这两个查询都返回 17949 的计数:

SELECT COUNT(DISTINCT email) FROM cm;
SELECT COUNT(email) FROM cm;

这意味着有... 18309 - 17949 = cms 中的记录比 cm 多 360 条。

然后我用以下方式查询差异:

SELECT COUNT(cms.email) FROM cms LEFT JOIN cm ON cm.email = cms.email WHERE cm.email IS NULL;

此查询返回 369。

差异来自哪里?

  • 两个表本身不包含重复记录。
  • 一个表比另一个表多 360 条记录。
  • 一个表中存在 369 条记录,而另一个表中不存在。

那九个记录是什么??

【问题讨论】:

  • 该列中有空值吗?
  • 部分记录不匹配。

标签: sql postgresql duplicates


【解决方案1】:

没什么神秘的。每个表中都有电子邮件,而另一个表中没有。

你有:

  • cms 中的 18,309 封电子邮件,其中 cm 中的 17,940 (18,309 - 369) 封电子邮件。
  • cm 中的 17,949 封电子邮件,其中 cms 中的 17,940 封电子邮件。
  • 您有 369 个仅在 cms 中。
  • 您有 9 个仅在 cm 中。

【讨论】:

  • 啊,当然。确实是一时的愚蠢。虽然现在我必须弄清楚,从业务 PoV 来看,记录是如何在表 B 中结束的,而显然没有通过表 A,这应该是不可能的。耶。无论如何,非常感谢。
【解决方案2】:

不仅大表中有邮件在小表中没有,而且小表中的一些邮件在大表中也丢失了。

您可以使用full join 来计算两个表中的孤儿:

select 
    count(*) filter(where cm.email  is null) in_cms_but_not_in_cm,  -- 369
    count(*) filter(where cms.email is null) in_cm_but_not_in_cms   -- 9
from cm
full join cms using(email)
where cm.email is null or cms.email is null

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 2011-03-30
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 2011-09-29
    相关资源
    最近更新 更多