Я бы использовал CTE (Common Table Expression), используя для этого функцию ранжирования ROW_NUMBER()
:
;WITH GroupedNames AS
(
SELECT ID, Name,
ROW_NUMBER() OVER(PARTITION BY Name ORDER BY ID) AS 'RowNum'
FROM
dbo.YourTable
)
SELECT *
FROM GroupedNames
Это «разделит» ваши данные с помощью, например, создания групп по имени, и каждыйгруппа получит последовательные номера, начиная с 1. Таким образом, вы можете легко выбрать все, кроме записи (ID, Name)
с наименьшим идентификатором с этим:
.....
SELECT *
FROM GroupedNames
WHERE RowNum > 1
, и если вам нужно, вы даже можете использовать этона самом деле удалить все эти имена с номером строки больше 1 (все "дубликаты"):
;WITH GroupedNames AS
(
SELECT ID, Name,
ROW_NUMBER() OVER(PARTITION BY Name ORDER BY ID) AS 'RowNum'
FROM
dbo.YourTable
)
DELETE FROM GroupedNames
WHERE RowNum > 1