假设我有一个包含两列的表,一列用于ID,另一列用于Name。此表中的所有名称都出现不止一次。
如何获取表格中的所有ID,不包括每个名称的最小ID?
答案 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