Получение меньшего индекса для каждого дубликата в SQL - PullRequest
2 голосов
/ 08 апреля 2011

Допустим, у меня есть таблица с двумя столбцами, один столбец для идентификатора и другой для имени.Все имена в этой таблице встречаются более одного раза.

Как получить все идентификаторы в таблице, исключая наименьшие идентификаторы для каждого имени?

Ответы [ 4 ]

4 голосов
/ 08 апреля 2011

В SQL Server 2005+ вы можете пойти так:

SELECT ID FROM atable
EXCEPT
SELECT MIN(ID) FROM atable GROUP BY Name
2 голосов
/ 08 апреля 2011

Я бы использовал 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
1 голос
/ 08 апреля 2011
SELECT DISTINCT b.id
FROM yourTable a
  JOIN yourTable b
    ON a.name = b.name
    AND a.id < b.id
1 голос
/ 08 апреля 2011

Может быть, это будет работать?

SELECT id FROM table WHERE id NOT IN (SELECT MIN(id) FROM table GROUP BY name)
...