Non hai specificato quale versione stavi utilizzando, ma in SQL 2005 e versioni successive è possibile utilizzare un'espressione di tabella comune con la clausola OVER. Va un po' come questo:
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
Giocaci e guarda cosa ottieni.
(Modifica:nel tentativo di essere d'aiuto, qualcuno ha modificato il ORDER BY
clausola all'interno del CTE. Per essere chiari, puoi ordinare in base a ciò che vuoi qui, non deve essere una delle colonne restituite dal cte. In effetti, un caso d'uso comune qui è che "foo, bar" sono l'identificatore del gruppo e "baz" è una sorta di timestamp. Per tenerti aggiornato, dovresti fare ORDER BY baz desc
)