无法删除部分重复行

时间:2013-04-11 10:34:48

标签: sql sql-server group-by distinct

我正在尝试删除部分重复的行;某些键值相同的行。要做到这一点,我必须根据col。

选择要删除的重复行

例如:数据表

col1, col2, col3
1,     1,    1
2,     2,    2
1,     1,    2
2,     2,    3

我想摆脱col 1和2上重复的行,并保留col3上最高的行,导致

col1, col2, col3
1,     1,    2
2,     2,    3

我认为可行的方法是在distinct上执行选择col 1 and 2语句,但我无法在col3中处理结果。

SELECT DISTINCT [col1], [col2]  FROM [table]

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

DELETE t
FROM dbo.test83 t
WHERE NOT EXISTS (
                  SELECT 1
                  FROM dbo.test83 t2
                  WHERE t.Col1 = t2.Col1
                    AND t.Col2 = t2.Col2
                  HAVING MAX(t2.col3) = t.col3
                  )

SQLFiddle上的演示

同样在SQLServer2005 +中你可以使用选项与CTE和ROW_NUMBER()排名函数

;WITH cte AS
 (      
  SELECT ROW_NUMBER() OVER(PARTITION BY t.Col1, t.Col2 ORDER BY t.Col3 DESC) AS rn
  FROM dbo.test83 t
  )
  DELETE
  FROM cte
  WHERE rn > 1

答案 1 :(得分:0)

尝试添加UNIQUE INDEX,如下所示:

ALTER IGNORE TABLE tablename ADD UNIQUE INDEX idx_name (col1, col2 );

这将删除所有重复的行,并防止将来重复插入。您可能希望在运行此类内容之前进行备份...

答案 2 :(得分:0)

这个选择能否为您提供所需的结果?

select [col1], [col2], max([col3]) from [table3] group by col1,col2

也许您可以将此select的结果插入到表中并用新表替换旧表?我认为这可能不是最好的解决方案,但也许这个查询可以帮助您找到所需的内容。

答案 3 :(得分:0)

得到了感谢另一个stackOverflow帖子......

SELECT * 
FROM [TABLE] a 
     LEFT JOIN [TABLE] a2
         ON a.col3<a2.col3 AND a.col1=a2.col1 and a.col2=a2.col2
WHERE a2.col2 IS NULL