SQL Server中如何基于指定列查找重复行(附示例)
解决基于Name和Birthday列筛选重复数据行的问题
我来帮你搞定这两个筛选需求,下面用SQL来实现(这是处理这类数据表操作最常用的方式),先看原始数据表:
ID Name Birthday 01 Eric 06/20 02 Judy 03/15 03 Mary 04/01 04 John 03/15 05 Judy 06/20 06 John 09/11
1. 基于Name列筛选出重复Name的所有行
你的需求是保留所有Name出现多次的行(也就是Judy和John的所有记录),可以用窗口函数快速实现:
SELECT ID, Name, Birthday FROM ( SELECT ID, Name, Birthday, COUNT(*) OVER (PARTITION BY Name) AS name_count FROM your_table_name ) sub WHERE name_count > 1 ORDER BY ID;
解释:
- 子查询里用
COUNT(*) OVER (PARTITION BY Name)计算每个Name在表中出现的总次数,把这个值存为name_count - 外层查询筛选出
name_count > 1的行,也就是Name重复的所有记录 - 最后按ID排序,就能得到你要的结果:
ID Name Birthday 02 Judy 03/15 04 John 03/15 05 Judy 06/20 06 John 09/11
2. 基于Birthday列筛选出重复Birthday的所有行
这个需求是保留所有Birthday出现多次的行,同样用窗口函数的思路,只是把分区字段换成Birthday:
SELECT ID, Name, Birthday FROM ( SELECT ID, Name, Birthday, COUNT(*) OVER (PARTITION BY Birthday) AS birthday_count FROM your_table_name ) sub WHERE birthday_count > 1 ORDER BY ID;
解释:
- 子查询里用
COUNT(*) OVER (PARTITION BY Birthday)计算每个生日出现的次数,存为birthday_count - 外层筛选
birthday_count > 1的行,也就是生日重复的所有记录 - 按ID排序后得到目标结果:
ID Name Birthday 01 Eric 06/20 02 Judy 03/15 04 John 03/15 05 Judy 06/20
如果你的数据库不支持窗口函数(比如一些老版本的MySQL),也可以用IN子查询的方式,比如第一个需求可以写成:
SELECT ID, Name, Birthday FROM your_table_name WHERE Name IN ( SELECT Name FROM your_table_name GROUP BY Name HAVING COUNT(*) > 1 ) ORDER BY ID;
原理是先找出所有重复的Name,再用这些Name去筛选原表的行,效果和窗口函数一致。
内容的提问来源于stack exchange,提问作者Pikachu620
相关产品推荐
相关产品推荐

