【问题标题】:Remove rows with duplicate values [duplicate]删除具有重复值的行 [重复]
【发布时间】:2013-04-04 14:41:35
【问题描述】:

我必须清理有重复行的表:

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? (此外,还有关于这个确切主题的其他帖子。)
  • 你能不能少含糊。您想DELETE 数据还是只想隐藏查询中的冗余数据?说“删除行”和“清理表格”之类的话,然后用“保持它们原样”之类的话自相矛盾,这会使您很难帮助您,正如您从下面的答案和 cmets 中看到的那样。
  • 清理桌子是什么意思?永远删除它们。
  • "清理桌子是什么意思?"在这里,我们有一个名为“Spray and Wipe”的产品 ;-)

标签: sql sql-server


【解决方案1】:
;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 下的注释行...

【讨论】:

  • +1 因为这是正确的答案,但我不清楚您是否要在分区中包含 gid 。我认为基于他可能希望包含的语言。
  • @Love2Learn 是的,更新跨越
  • 知道了,错过了那个。 :)
  • 起初这对我来说看起来很陌生,然后当我写这个来适应我自己的桌子和需求时,它开始变得很有意义,并且工作得很好!谢谢,亚伦!很好的答案!帮助很大,而且没有一个语法错误!
  • @Pila 这个问题是关于 Microsoft SQL Server,而不是 MySQL。
【解决方案2】:
SELECT 
MIN(id) AS id,
gid,
url
FROM yourTable
GROUP BY gid, url 

【讨论】:

  • 我可以引用 OP:“我必须保持原样”我没有看到任何提到删除任何内容的内容。
  • “删除行”和“清理表格”?
  • 好吧,好吧,我还是让我的答案,让 OP 看看那些“GROUP BY 和 HAVING 技巧”是如何工作的。
  • +1 @AaronBertrand 我不同意 - 这个问题是模棱两可的......我也认为它的意思是“我如何呈现数据'清理',删除重复项,同时保留源数据”。我想我宁愿不删除;-)
猜你喜欢
  • 2019-06-30
  • 2017-08-17
  • 2015-05-25
  • 2017-03-02
  • 1970-01-01
  • 2016-06-01
  • 2019-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多