Neřekli jste, jakou verzi používáte, ale v SQL 2005 a vyšších můžete použít běžný tabulkový výraz s klauzulí OVER. Funguje to trochu takto:
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
Pohrajte si s tím a uvidíte, co získáte.
(Upravit:Ve snaze být užitečný někdo upravil ORDER BY
doložka v rámci CTE. Aby bylo jasno, zde můžete objednávat podle čeho chcete, nemusí to být jeden ze sloupců vrácených CTE. Ve skutečnosti je zde běžným případem použití, že „foo, bar“ je identifikátor skupiny a „baz“ je nějaký druh časového razítka. Chcete-li zachovat nejnovější, proveďte ORDER BY baz desc
)