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

时间:2015-08-28 15:15:24

标签: oracle11g count group-by distinct

我有一个表t1,其中包含几个字段,一个是INC_ID。我希望用重复的INC_ID值识别并删除t1中的记录。

对于后台,t1中的其他列可能在具有INC_ID重复的记录中相同,但它们可能不相同。 e.g。

INC_ID,VAL1,VAL2

144345,Red7,ABC

144345,Red7,ABC

144346,Grn2,DEF

144346,Grn2,DEF

执行时

SELECT COUNT(*)
FROM t1

按预期返回10,000。

执行时

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

它返回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)

但仍然会返回9,987。很明显,我对DISTINCT的工作原理有一些缺陷。有人可以向我解释这个原因吗?提前感谢您的时间。

1 个答案:

答案 0 :(得分:1)

你有10,000个值; 9,974只出现一次;另外26个是两个出现,每个出现13个值("在26个记录中只有13个唯一的INC_ID")。您可以通过向第三个查询添加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)并未向您提供表中唯一值的值 - 您的9,974值。它查看所有值,但只计算每个不同的值一次。如果它多次看到相同的值,那么它仍然包含该值,但只计算一次,无论它出现多少次。它不会完全排除它,您使用HAVING子句来获取9,974值。您的13个非独特值(26个外观)仍然是13个不同的值。

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