使用しているバージョンは指定していませんが、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によって返される列の1つである必要はありません。実際、ここでの一般的な使用例は、「foo、bar」がグループ識別子であり、「baz」が何らかのタイムスタンプであるというものです。最新の状態に保つには、ORDER BY baz desc
を実行します。 )