Du sa inte vilken version du använde, men i SQL 2005 och senare kan du använda ett vanligt tabelluttryck med OVER-satsen. Det ser ut ungefär så här:
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
Lek med det och se vad du får.
(Redigering:I ett försök att vara till hjälp redigerade någon ORDER BY
klausul inom CTE. För att vara tydlig kan du beställa efter vad du vill här, det behöver inte vara en av kolumnerna som returneras av cte. Faktum är att ett vanligt användningsfall här är att "foo, bar" är gruppidentifieraren och "baz" är någon slags tidsstämpel. För att behålla det senaste, gör du ORDER BY baz desc
)