我要选择没有重复的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
答案 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()
的聚合查询无法做到)。此外,使用窗口功能的查询通常 比等效的聚合查询要好。