Du sagde ikke hvilken version du brugte, men i SQL 2005 og nyere kan du bruge et almindeligt tabeludtryk med OVER-klausulen. Det lyder lidt sådan her:
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
Leg med det og se, hvad du får.
(Rediger:I et forsøg på at være hjælpsom, redigerede nogen ORDER BY
klausul i CTE. For at være klar, kan du bestille efter hvad som helst her, det behøver ikke at være en af kolonnerne, der returneres af cte. Faktisk er en almindelig anvendelse her, at "foo, bar" er gruppe-id'en, og "baz" er en slags tidsstempel. For at beholde det seneste, skal du gøre ORDER BY baz desc
)