SQL如何按条件删除重复记录,仅保留idperson1值最大的行
问题描述
我的示例表如下:
| idmain | idtime | idperson1 | idperson2 |
|---|---|---|---|
| 141 | 20220106 | 510 | 384 |
| 221 | 20220107 | 300 | 184 |
| 221 | 20220107 | 301 | 184 |
| 465 | 20220108 | 300 | 184 |
| 525 | 20220109 | 111 | 123 |
| 525 | 20220109 | 112 | 123 |
| 525 | 20220109 | 113 | 123 |
重复记录仅在idperson1字段值上存在差异,需要删除这类重复记录,仅保留每组中idperson1字段值最大的记录,最终期望得到的结果表如下:
| idmain | idtime | idperson1 | idperson2 |
|---|---|---|---|
| 141 | 20220106 | 510 | 384 |
| 221 | 20220107 | 301 | 184 |
| 465 | 20220108 | 300 | 184 |
| 525 | 20220109 | 113 | 123 |
解决方法(适用于SQL Server环境)
使用窗口函数ROW_NUMBER()按重复判定维度分组,组内按idperson1倒序编号,仅保留每组编号为1的记录即可。
- 查询去重后的结果:
SELECT idmain, idtime, idperson1, idperson2 FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY idmain, idtime, idperson2 ORDER BY idperson1 DESC ) AS row_num FROM 替换为你的实际表名 ) t WHERE row_num = 1;
- 直接删除原表中的重复数据:
如果需要直接清理原表的重复记录,可以用可更新CTE写法,执行前务必备份数据:
WITH dedup_cte AS ( SELECT ROW_NUMBER() OVER ( PARTITION BY idmain, idtime, idperson2 ORDER BY idperson1 DESC ) AS row_num FROM 替换为你的实际表名 ) DELETE FROM dedup_cte WHERE row_num > 1;
内容的提问来源于stack exchange,提问作者Andres Mora
相关产品推荐
相关产品推荐

