获取SQL中每个副本的较小索引

时间:2011-04-08 04:50:32

标签: sql sql-server duplicates

假设我有一个包含两列的表,一列用于ID,另一列用于Name。此表中的所有名称都出现不止一次。

如何获取表格中的所有ID,不包括每个名称的最小ID?

4 个答案:

答案 0 :(得分:4)

在SQL Server 2005+中你可以这样:

SELECT ID FROM atable
EXCEPT
SELECT MIN(ID) FROM atable GROUP BY Name

答案 1 :(得分:2)

我会使用ROW_NUMBER()排名函数的CTE(公用表表达式):

;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)之外的所有内容,其中包含最小ID:

.....
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

答案 2 :(得分:1)

也许这会起作用?

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

答案 3 :(得分:1)

SELECT DISTINCT b.id
FROM yourTable a
  JOIN yourTable b
    ON a.name = b.name
    AND a.id < b.id