查找重复数据SQL

问题描述:

让我先给一些示例表格,这将使我的问题更容易理解。查找重复数据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的值是相同的。

您无法通过连接进行分组。这会将'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

如果我理解你的问题正确,

你想为你的表具有唯一的行记录。 而不是使用亚伦提到的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