如何从重复行中选取第一条记录?附重复数据排查场景
从重复记录中选取第一条的解决方案
要从HREMP表的重复记录里,为每个重复的ID保留第一条记录,用窗口函数ROW_NUMBER()是最直接的方案,给你两种实用写法:
方法一:子查询写法
SELECT * FROM ( SELECT a.*, -- 按ID分组,给每组内的记录编序号;用(SELECT NULL)表示不指定排序规则,取数据库默认返回的第一条 ROW_NUMBER() OVER (PARTITION BY a.ID ORDER BY (SELECT NULL)) AS rn FROM HREMP a ) tt WHERE tt.rn = 1;
方法二:CTE(公共表表达式)写法(更易读)
如果你的数据库支持CTE(比如MySQL 8.0+、PostgreSQL、SQL Server等),可以用这种结构更清晰的写法:
WITH ranked_employees AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY (SELECT NULL)) AS rn FROM HREMP ) SELECT * FROM ranked_employees WHERE rn = 1;
关键补充说明
- 如果你需要明确指定“第一条”的规则(比如取创建时间最早的记录),把
ORDER BY (SELECT NULL)换成对应的业务字段即可,示例:ROW_NUMBER() OVER (PARTITION BY ID ORDER BY create_time ASC) AS rn - 执行后,结果会包含所有非重复记录(685条)加上每个重复ID的第一条记录(196条),总共881条,完全匹配你的数据统计逻辑。
内容的提问来源于stack exchange,提问作者Bodhi
相关产品推荐
相关产品推荐

