You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:49:25