2012-04-16 166 views
0

讓我先給一些示例表格,這將使我的問題更容易理解。查找重複數據SQL

Column1  Column2  Column3 
Valuea  Value123  Value456 
Valueax  Value123  Value456 
Valueb  Value123  Value456 
Valueb  Value123  Value456 

select Column1, 
    Column2, 
     Column3, 
     count(*) 
from  ColumnName 
group by 
    Column1, 
    Column2, 
    Column3, 
having count(Count2+Count3) > 1 

我想回到「列1」,「列2」,「欄3」,其中列2and3將包含超過重複以上,但「列1」必須是不同的。所以,目前上面的代碼將返回:

Valueb  Value123  Value456 2 

,但我想它返回

Valuea  Value123  Value456 
Valueax  Value123  Value456 

其中COLUMN1都有不同的價值觀,但列2和欄3的值是相同的。

回答

3

您無法通過連接進行分組。這會將'xxx'+'yyy'視爲'x'+'xxyyy'。如何獲得

;WITH x AS 
(
    SELECT Column2, Column3 
    FROM dbo.table GROUP BY Column2, Column3 
    HAVING COUNT(*) > 1 
) 
SELECT t.Column1, t.Column2, t.Column3 
FROM x INNER JOIN dbo.table AS t 
ON x.Column2 = t.Column2 
AND x.Column3 = t.Column3 
GROUP BY t.Column1, t.Column2, t.Column3 
HAVING COUNT(*) = 1; 

這假定這些列都不可空。

+0

注意,如果你有相同的三行,有些是重複的(例如'Valuea','Valueax'和'Valueax'),後兩者不會被報告......如果這些是潛在的情況,您需要提供更多的樣本數據以及您希望如何處理這些案件。 – 2012-04-16 18:15:22

0

如果我理解你的問題正確,

你想爲你的表具有唯一的行記錄。 而不是使用亞倫提到的Group By不能用於連接。

但是,您可以使用Over來做到這一點。

UPDATE:你需要考慮什麼是你需要組合在一起亞倫提到「X」 +「YY」是「XY」 +「Y」

With Data AS 
(
SELECT ROW_NUMBER() Over 
    (Partition By "Key" Order by "Key") as R, 
    Column1, Column2, Column3 
) 
SELECT * FROM Data 
WHERE R = 1 
+1

'分區按列1 +列2 +列3'?這很危險。 ''x'+'yy'+'z'將被視爲與''xy'+'y'+'z''相同,但我不認爲這些行是相同的。在任何情況下,即使你忽略了,我不認爲這給出了預期的結果 - 爲什麼'WHERE R = 1'? – 2012-04-16 18:01:05

+0

在閱讀您的文章後,我沒有注意到。我會編輯答案。 – Turbot 2012-04-16 18:32:44

+0

仍然沒有看到這可能如何推導出所需的結果。 – 2012-04-16 21:57:32