需要帮助理解为什么 COUNT DISTINCT 返回奇怪的结果

Need help understanding why COUNT DISTINCT is returning an odd result

我有一个 table t1,其中包含多个字段,其中一个是 INC_ID。我一直在寻找识别并删除 t1 中具有重复值 INC_ID 的记录。

作为背景,t1 中的其他列在具有 INC_ID 重复项的记录中可能相同,也可能不同。例如

INC_ID, VAL1, VAL2

144345,红 7,ABC

144345,红 7,ABC

144346,Grn2,DEF

144346,Grn2,DEF


当我执行

SELECT COUNT(*)
FROM t1

它 returns 10,000 符合预期。

当我执行

SELECT COUNT(*)
FROM t1
WHERE INC_ID IN
(SELECT INC_ID
FROM t1
GROUP BY INC_ID
HAVING COUNT(*)=1)

它 returns 9,974。我假设这意味着我有 9,974 条记录具有唯一 INC_ID

当我执行

SELECT COUNT(*)
FROM t1
WHERE INC_ID IN
(SELECT INC_ID
FROM t1
GROUP BY INC_ID
HAVING COUNT(*)>1)

我得到了预期的 26。额外检查显示确实有 26 条记录重复 INC_ID,26 条记录中只有 13 条唯一 INC_ID。

当我运行

SELECT COUNT(DISTINCT INC_ID)
FROM t1

我得到 9,987。不理解这一点,我认为可能是由于其他列不同而导致记录不同,即使 INC_ID 相同。

然后我试了

SELECT COUNT(DISTINCT INC_ID)
FROM
(SELECT INC_ID
FROM t1)

但那仍然是 returns 9,987。显然,我对 DISTINCT 工作原理的理解存在一些缺陷。有人可以向我解释这是为什么吗?提前感谢您的宝贵时间。

您有 10,000 个值; 9,974只出现一次;其他 26 个是 13 个值中的两个外观 ("there being only 13 unique INC_IDs in the 26 records")。您将通过向第三个查询添加 distinct 获得 13:

SELECT COUNT(DISTINCT INC_ID)
FROM t1
WHERE INC_ID IN
(SELECT INC_ID
FROM t1
GROUP BY INC_ID
HAVING COUNT(*)>1)

因此,您有 9,974 个出现一次的不同值,以及 13 个出现两次的不同值 - 总计 9,987 个。或者换个角度看,你有 13 个值是重复的,10,000 减去 13 仍然是 9,987。

我觉得一切都很好。 SQL Fiddle demo 获取类似数据,获取您显示的计数,并包括上面的查询和所有非唯一 ID 行的列表。

COUNT(DISTINCT INC_ID) 不会只为您提供 table 中唯一的那些值的计数 - 您的 9,974 值。它正在查看所有值,但只计算每个不同的值一次。如果它多次看到相同的值,那么它仍然包括该值,但只会计算一次,无论它出现多少次。它并没有完全排除它,您正在使用 HAVING 子句来获取 9,974 值。出现 26 次的 13 个非唯一值仍然是 13 个不同的值。


顺便说一句,这里有一个 simplistic way to delete duplicates,但是每个重复对中保留哪一个是不确定的 - 如果整行相同那并不重要。它只适用于成对的值,尽管你可以 运行 多次直到它找不到要删除的东西。如果行不相同并且您关心保留哪些行,那么您需要做更多的工作,但需要先定义您的标准。