Anda tidak mengatakan versi apa yang Anda gunakan, tetapi dalam SQL 2005 dan yang lebih baru, Anda dapat menggunakan ekspresi tabel umum dengan Klausa OVER. Kurang lebih seperti ini:
WITH cte AS (
SELECT[foo], [bar],
row_number() OVER(PARTITION BY foo, bar ORDER BY baz) AS [rn]
FROM TABLE
)
DELETE cte WHERE [rn] > 1
Main-main dengannya dan lihat apa yang Anda dapatkan.
(Sunting:Untuk membantu, seseorang mengedit ORDER BY
klausul dalam CTE. Agar jelas, Anda dapat memesan dengan apa pun yang Anda inginkan di sini, tidak perlu salah satu kolom yang dikembalikan oleh cte. Faktanya, kasus penggunaan umum di sini adalah bahwa "foo, bar" adalah pengidentifikasi grup dan "baz" adalah semacam cap waktu. Untuk mendapatkan yang terbaru, Anda akan melakukan ORDER BY baz desc
)