如何处理仅id列不同的表重复行 实现每组重复记录仅保留单条
数据表重复行查询去重实现方案
你的需求是基于name、roll_number两个字段去重,每组仅保留id最小的一条记录,可参考以下几种常用实现方式:
方法1:GROUP BY + 子查询(兼容性最好,支持所有主流数据库)
先通过分组拿到每个重复组的最小id,再关联原表获取完整行数据:
SELECT t.* FROM 你的表名 t INNER JOIN ( SELECT MIN(id) AS min_id FROM 你的表名 GROUP BY name, roll_number ) t2 ON t.id = t2.min_id ORDER BY t.id;
方法2:ROW_NUMBER窗口函数(更灵活,MySQL8.0+、PostgreSQL、SQL Server、Oracle均支持)
给每个重复组的行按id升序排序打行号,取每个组行号为1的记录即可:
SELECT id, name, roll_number FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY name, roll_number ORDER BY id ASC) AS rn FROM 你的表名 ) t WHERE rn = 1 ORDER BY id;
方法3:DISTINCT ON(仅PostgreSQL支持,写法最简洁)
如果使用PostgreSQL数据库,可以直接用特有语法实现:
SELECT DISTINCT ON (name, roll_number) id, name, roll_number FROM 你的表名 ORDER BY name, roll_number, id ASC;
以上三种方法执行后都可以得到你预期的输出结果,每组重复行仅保留id最小的一条。
内容的提问来源于stack exchange,提问作者ketan
相关产品推荐
相关产品推荐

