Assumindo que não há nulos, você
GROUP BY
as colunas exclusivas e SELECT
o MIN (or MAX)
RowId como a linha a ser mantida. Em seguida, basta excluir tudo o que não tinha um ID de linha:DELETE FROM MyTable
LEFT OUTER JOIN (
SELECT MIN(RowId) as RowId, Col1, Col2, Col3
FROM MyTable
GROUP BY Col1, Col2, Col3
) as KeepRows ON
MyTable.RowId = KeepRows.RowId
WHERE
KeepRows.RowId IS NULL
Caso você tenha um GUID em vez de um inteiro, você pode substituir
MIN(RowId)
com
CONVERT(uniqueidentifier, MIN(CONVERT(char(36), MyGuidColumn)))