我正在尝试删除部分重复的行;某些键值相同的行。要做到这一点,我必须根据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]
有什么想法吗?
答案 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