U hebt niet gezegd welke versie u gebruikte, maar in SQL 2005 en hoger kunt u een algemene tabelexpressie gebruiken met de OVER-clausule. Het gaat een beetje als volgt:
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
Speel ermee en kijk wat je krijgt.
(Bewerken:in een poging om behulpzaam te zijn, heeft iemand de ORDER BY
bewerkt clausule binnen de CTE. Voor alle duidelijkheid, je kunt hier bestellen op alles wat je wilt, het hoeft niet een van de kolommen te zijn die door de cte worden geretourneerd. In feite is een veelvoorkomend gebruik hier dat "foo, bar" de groepsidentificatie is en "baz" een soort tijdstempel is. Om op de hoogte te blijven, doet u ORDER BY baz desc
)