Sie haben nicht gesagt, welche Version Sie verwenden, aber in SQL 2005 und höher können Sie einen allgemeinen Tabellenausdruck mit der OVER-Klausel verwenden. Es geht ungefähr so:
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
Spielen Sie damit herum und sehen Sie, was Sie bekommen.
(Bearbeiten:Um hilfreich zu sein, hat jemand den ORDER BY
bearbeitet Klausel innerhalb des CTE. Um es klar zu sagen, Sie können hier alles bestellen, was Sie wollen, es muss keine der Spalten sein, die von cte zurückgegeben werden. Tatsächlich ist ein häufiger Anwendungsfall hier, dass "foo, bar" die Gruppenkennung und "baz" eine Art Zeitstempel sind. Um auf dem neuesten Stand zu bleiben, würden Sie ORDER BY baz desc
ausführen )