Не казахте коя версия използвате, но в SQL 2005 и по-нова версия можете да използвате общ израз на таблица с клаузата OVER. Става малко по следния начин:
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
Играйте с него и вижте какво получавате.
(Редактиране:В опит да бъде полезен, някой редактира ORDER BY
клауза в CTE. За да е ясно, можете да поръчате по всичко, което искате тук, не е необходимо да е една от колоните, върнати от cte. Всъщност често срещаният случай на употреба тук е, че "foo, bar" са идентификаторът на групата, а "baz" е някакъв вид времеви печат. За да запазите най-новото, трябва да направите ORDER BY baz desc
)