在基于一列的选择查询中删除重复项

时间:2019-03-28 21:05:58

标签: sql sql-server tsql

我要选择没有重复的id,并在选择语句中保留行'5d'而不是'5e'

id | name
1  | a
2  | b
3  | c
5  | d
5  | e

我尝试过:

SELECT id, name 
FROM table t
INNER JOIN (SELECT DISTINCT id FROM table) t2 ON t.id = t2.id

3 个答案:

答案 0 :(得分:4)

对于给定的示例,使用min()的聚合将起作用。

SELECT id,
       min(name) name
       FROM table
       GROUP BY id;

答案 1 :(得分:1)

如果要保留名称最小的行,则可以使用not exists

select t.* from tablename t
where not exists (
  select 1 from tablename
  where id = t.id and name < t.name
)

答案 2 :(得分:1)

您也可以使用ROW_NUMBER()

SELECT id, name
FROM (
    SELECT id, name, ROW_NUMBER() OVER(PARTITION BY id ORDER BY name) rn 
    FROM mytable
) x
WHERE rn = 1

这将保留具有最小name的记录(因此'5d'将在'5e'之前)。使用此技术,您还可以在存在重复项的另一列上使用排序标准(使用MIN()的聚合查询无法做到)。此外,使用窗口功能的查询通常 比等效的聚合查询要好。