2

我正在尝试删除部分重复的行;某些键值相同的行。为此,我必须根据 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

4 回答 4

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
于 2013-04-11T11:51:12.817 回答
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
于 2013-04-11T12:32:03.113 回答
0

尝试添加一个UNIQUE INDEX,像这样:

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

这将删除所有重复的行,并防止将来重复插入。您可能想在运行这样的事情之前进行备份......

于 2013-04-11T10:45:54.033 回答
0

此选择是否为您提供了您正在寻找的结果?

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

也许您可以将此选择的结果插入到表中并用新表替换旧表?我认为这可能不是最好的解决方案,但也许这个查询可以帮助你找到你正在寻找的东西。

于 2013-04-11T11:46:00.047 回答