Bạn không cho biết bạn đang sử dụng phiên bản nào, nhưng trong SQL 2005 trở lên, bạn có thể sử dụng một biểu thức bảng chung với Mệnh đề OVER. Nó giống như sau:
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
Chơi với nó và xem bạn nhận được gì.
(Chỉnh sửa:Để tỏ ra hữu ích, ai đó đã chỉnh sửa ORDER BY
mệnh đề trong CTE. Để rõ ràng, bạn có thể đặt hàng theo bất kỳ thứ gì bạn muốn ở đây, nó không cần phải là một trong các cột được trả về bởi cte. Trên thực tế, một trường hợp sử dụng phổ biến ở đây là "foo, bar" là định danh nhóm và "baz" là một số loại tem thời gian. Để cập nhật thông tin mới nhất, bạn thực hiện ORDER BY baz desc
)