2013-04-04 64 views
3

刪除行我要清理與重複行的表:有重複值的

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了。

+0

SQL的什麼版本? (另外,在這個確切的話題上還有其他的帖子。) – 2013-04-04 14:43:26

+1

你能不那麼含糊不清。你想*刪除*數據還是隻想隱藏查詢中的冗餘數據?說出諸如「刪除行」和「清理表格」之類的東西,然後將自己與「保持原樣」等事物相提並論,使得試圖幫助你變得非常困難,正如你從下面的答案和評論中看到的那樣。 – 2013-04-04 14:54:29

+0

乾淨的桌子是什麼意思?永遠刪除它們。 – eyurdakul 2013-04-04 14:56:08

回答

12
;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註釋行...

+0

+1,因爲這是正確的答案,但我不清楚是否要將gid包含在分區中。我認爲基於他可能希望包含的語言。 – 2013-04-04 14:46:16

+0

@ Love2Learn yep,更新越過 – 2013-04-04 14:46:34

+0

嘿,錯過了那一個。 :) – 2013-04-04 14:46:56

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

我可以引用OP:「我必須保持它們原樣」我沒有看到任何刪除任何東西的提及。 – fancyPants 2013-04-04 14:47:48

+0

「刪除行」和「清理表格」? – 2013-04-04 14:48:25

+0

好的,好吧,無論如何,我會讓我的答案,就是讓OP看到那些「GROUP BY和HAVING技巧」是如何工作的。 – fancyPants 2013-04-04 14:51:23