с SQL Server вы бы использовали что-то вроде этого
DECLARE @Table TABLE (ID INTEGER, PossibleDuplicate INTEGER)
INSERT INTO @Table VALUES (1, 100)
INSERT INTO @Table VALUES (2, 100)
INSERT INTO @Table VALUES (3, 200)
INSERT INTO @Table VALUES (4, 200)
DELETE FROM @Table
OUTPUT Deleted.*
FROM @Table t
INNER JOIN (
SELECT ID = MAX(ID)
FROM @Table
GROUP BY PossibleDuplicate
HAVING COUNT(*) > 1
) d ON d.ID = t.ID
Оператор OUTPUT показывает удаляемые записи.
Обновление:
Выше запрос удалит дубликаты и даст вам строки, которые удаляются, а не строки, которые остаются. Если это важно для вас (в целом, оставшиеся 50 строк должны быть идентичны 50 удаленным строкам), вы можете использовать синтаксис SQL Server 2008 MERGE для достижения этого.