2015-08-28 21 views
0

我有一個包含幾個字段的表t1,其中一個是INC_ID。我正在尋找並刪除重複值爲INC_ID的t1中的記錄。需要幫助理解爲什麼COUNT DISTINCT返回奇數結果

對於背景,t1中的其他列可能與具有INC_ID重複的記錄相同,但它們可能不相同。例如

INC_ID,VAL1,VAL2

144345,紅7,ABC

144345,紅7,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) 

它返回9974。我假定這意味着我有9974條記錄與唯一的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

您有10,000個值; 9,974只出現一次;另外26個是兩個出現13個值的每一個(「26個記錄中只有13個唯一的INC_ID」)。你會從不同的添加到您的第三個查詢得到13:

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

所以,你有出現一次9974點不同的值,並出現兩次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,但每個副本對保持的哪一個是不確定的 - 如果整個行與這其實並不重要。它只適用於值對,儘管您可以多次運行它直到找不到任何要刪除的值。如果行不相同,並且您關心的是哪個行,那麼您需要做更多的工作,但需要首先定義標準。

+0

噢好吧,謝謝你的解釋,現在完全有道理。這是我去的重複刪除方法,重複中不同的列並不重要,因此它完全可以工作。 – Travis