Muszę oczyścić stół z podwójnymi wierszami:
id: serial id
gid: group id
url: string <- this is the column that I have to cleanup
Jeden gid
może mieć wiele url
wartości:
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
Chcę wykonać jedno zapytanie dla całej tabeli i usunąć wszystkie wiersze, w których gid
i url
są duplikatami. W powyższym przykładzie, po usunięciu, chcę mieć tylko 1, 2, 4 i 5 pozostałych.
Odpowiedzi:
12 dla odpowiedzi № 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
Kiedy jesteś zadowolony z pierwszego wyboru, którywskazuje wiersze, które będziesz przechowywać, usuń je i usuń komentarz z drugiego zaznaczenia. Gdy już to zrobisz, co wskazuje na wiersze, które usuniesz, usuń je i usuń komentarz z usunięcia.
A jeśli nie chcesz usuwać danych, po prostu zignoruj skomentowane linie pod SELECT
...
1 dla odpowiedzi nr 2
SELECT
MIN(id) AS id,
gid,
url
FROM yourTable
GROUP BY gid, url