删除具有重复值的行。

5

我需要清理一张有重复行的表格:

id: serial id
gid: group id
url: string <- this is the column that I have to cleanup

一个 gid 可以有多个 url 值:
id    gid   url
----  ----  ------------
1     12    www.gmail.com
2     12    www.some.com
3     12    www.some.com <-- duplicate
4     13    www.other.com
5     13    www.milfsome.com <-- not a duplicate

我希望执行一条查询来删除整个表中所有gidurl重复的行。在上面的示例中,删除后,我只想留下1、2、4和5。


SQL的哪个版本?(此外,还有其他关于这个确切主题的帖子。) - Eric J. Price
1
你能否请更明确一些?你是想要删除数据还是只是想在查询中隐藏冗余数据?像“删除行”和“清理表”这样的说法,然后又用“保持它们原样”的话自相矛盾,这让我们很难帮助你,正如下面的答案和评论所示。 - Aaron Bertrand
清空一张表是什么意思?永久删除它们。 - eyurdakul
1
“清理桌子”是什么意思?这里有一种产品叫做“喷雾擦拭”;-) - Sepster
2个回答

13
;WITH x AS 
(
   SELECT id, gid, url, rn = ROW_NUMBER() OVER
     (PARTITION BY gid, url ORDER BY id) 
   FROM dbo.table
)
SELECT id,gid,url FROM x WHERE rn = 1 -- the rows you'll keep
-- SELECT id,gid,url FROM x WHERE rn > 1 -- the rows you'll delete
-- DELETE x WHERE rn > 1; -- do the delete

当你对第一个select选择的行感到满意,这些行将保留,将其删除并取消注释第二个select。 当你对第二个select选择的行感到满意,这些行将被删除,将其删除并取消注释delete语句。

如果您不想删除数据,请忽略SELECT下面的已注释行。


同样的方法也适用于Oracle。 - IT ppl
1
一开始,这对我来说看起来很陌生,但是当我为自己的表格和需求编写代码时,它开始变得非常清晰,并且运行得非常好!感谢Aaron!非常好的答案!帮了我很多忙,而且没有任何语法错误! - VoidKing
这对我不起作用。我用我的表名替换了“x”,并将列替换为自己表中的列,但是出现了错误...` 您的SQL语法存在错误,请检查与您的MySQL服务器版本相对应的手册,以获取正确的语法使用方法,位于第1行附近的expenses AS ( SELECT expense_id, user_id, transaction_date, bank, rn = ROW_N' - Pila
1
@Pila 这个问题是关于 Microsoft SQL Server,不是 MySQL。 - Aaron Bertrand
@AaronBertrand 我明白了。:) 不过我从另一个StackOverflow的问题中得到了答案。 - Pila
显示剩余3条评论

1
SELECT 
MIN(id) AS id,
gid,
url
FROM yourTable
GROUP BY gid, url 

我可以引用原帖的话吗:“我必须保持它们原样”,我没有看到任何删除任何内容的地方提到。 - fancyPants
"remove rows" 和 "清理表格" - Aaron Bertrand
好的,好的,我还是会让我的答案出现,这样OP就能看到那些“GROUP BY和HAVING技巧”是如何工作的。 - fancyPants
+1 @AaronBertrand 我不同意 - 这个问题是含糊的... 我也认为它的意思是“我如何呈现已经清理过、去重后的数据,同时保留源数据”。我认为我会倾向于不删除;-) - Sepster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接