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

如何按全名与相近出生日期(DOB)查找数据库重复记录?

查找全名匹配且出生日期相差≤1年的重复记录方案

核心思路是通过自关联查询匹配相同全名的记录,同时筛选出生日期差值在1年内的条目,避免重复配对,最终输出需要核查的潜在重复项。

基础自关联SQL方案(通用写法)

SELECT 
    t1.Name,
    t1.DOB AS 出生日期1,
    t2.DOB AS 出生日期2,
    DATEDIFF(DAY, t1.DOB, t2.DOB) AS 天数差
FROM 
    your_table t1
JOIN 
    your_table t2 
    ON t1.Name = t2.Name 
    AND t1.DOB < t2.DOB  -- 避免重复输出A-B和B-A的配对
    AND DATEDIFF(DAY, t1.DOB, t2.DOB) <= 365  -- 限制差值不超过365天
ORDER BY 
    t1.Name, t1.DOB;

语句说明

  • 自关联同一张表,通过Name字段匹配全名相同的记录
  • t1.DOB < t2.DOB确保每组重复配对只显示一次,减少冗余结果
  • DATEDIFF计算两个日期的天数差,筛选出≤365天的记录(若需兼容闰年,可调整为366天,或用数据库原生的年份间隔函数更精准)

数据库专属优化写法

不同数据库支持更直观的日期间隔语法,推荐使用以下写法提升可读性:

MySQL/MariaDB

SELECT 
    t1.Name,
    t1.DOB AS 出生日期1,
    t2.DOB AS 出生日期2,
    DATEDIFF(t2.DOB, t1.DOB) AS 天数差
FROM 
    your_table t1
JOIN 
    your_table t2 
    ON t1.Name = t2.Name 
    AND t1.DOB < t2.DOB
    AND t2.DOB <= DATE_ADD(t1.DOB, INTERVAL 1 YEAR)
ORDER BY 
    t1.Name, t1.DOB;

PostgreSQL

SELECT 
    t1.Name,
    t1.DOB AS 出生日期1,
    t2.DOB AS 出生日期2,
    (t2.DOB - t1.DOB) AS 天数差
FROM 
    your_table t1
JOIN 
    your_table t2 
    ON t1.Name = t2.Name 
    AND t1.DOB < t2.DOB
    AND t2.DOB <= t1.DOB + INTERVAL '1 year'
ORDER BY 
    t1.Name, t1.DOB;

SQL Server

SELECT 
    t1.Name,
    t1.DOB AS 出生日期1,
    t2.DOB AS 出生日期2,
    DATEDIFF(DAY, t1.DOB, t2.DOB) AS 天数差
FROM 
    your_table t1
JOIN 
    your_table t2 
    ON t1.Name = t2.Name 
    AND t1.DOB < t2.DOB
    AND t2.DOB <= DATEADD(YEAR, 1, t1.DOB)
ORDER BY 
    t1.Name, t1.DOB;

分组展示所有相关记录

如果需要将同一组的所有记录放在一起展示(而非两两配对),可以使用窗口函数:

WITH potential_duplicates AS (
    SELECT 
        Name,
        DOB,
        -- 统计当前记录所在Name组中,出生日期在±1年内的记录数
        COUNT(*) OVER (
            PARTITION BY Name 
            RANGE BETWEEN INTERVAL 1 YEAR PRECEDING AND INTERVAL 1 YEAR FOLLOWING
        ) AS 关联记录数
    FROM your_table
)
SELECT Name, DOB
FROM potential_duplicates
WHERE 关联记录数 > 1
ORDER BY Name, DOB;

额外优化建议

  • 索引优化:给Name和DOB建立联合索引(CREATE INDEX idx_name_dob ON your_table(Name, DOB);),大幅提升大表查询效率
  • 处理拼写误差:如果全名存在输入错误(比如Tom Johnson和Tom Johson),可搭配模糊匹配函数(如MySQL的SOUNDEX()、PostgreSQL的levenshtein())扩展匹配逻辑

内容的提问来源于stack exchange,提问作者Mad-Chemist

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 11:17:33