如何查找并清理RF_CUSTOMER表中重复OID且出生年份错误的数据
优化RF_CUSTOMER重复数据查询SQL方案
你的原SQL仅能找出所有OID重复的记录,但无法精准定位「同一OID下同时存在错误出生年份和正确出生年份」的目标数据,以下是针对性的优化方案:
方案1:针对已知错误/正确年份(如2052和1952)
如果已经明确错误年份和对应正确值,可直接筛选同时包含这两个年份的OID记录:
SELECT * FROM RF_CUSTOMER WHERE OID IN ( SELECT OID FROM RF_CUSTOMER -- 假设存储生日的字段为birth_date,提取年份;如果是字符串类型,可改用SUBSTRING(birth_date, 1, 4) WHERE YEAR(birth_date) IN (1952, 2052) GROUP BY OID HAVING COUNT(DISTINCT YEAR(birth_date)) = 2 ) ORDER BY OID, YEAR(birth_date);
方案2:通用异常年份检测
如果需要覆盖所有不合理的出生年份(比如未来年份、过早年份),可先标记异常年份,再筛选同一OID下既有异常又有正常的记录:
WITH customer_year AS ( SELECT *, YEAR(birth_date) AS birth_year, -- 自定义异常年份规则:这里以"大于当前年份或早于1900"为例 CASE WHEN YEAR(birth_date) > YEAR(CURRENT_DATE) OR YEAR(birth_date) < 1900 THEN 1 ELSE 0 END AS is_abnormal FROM RF_CUSTOMER ) SELECT cy.* FROM customer_year cy WHERE cy.OID IN ( SELECT OID FROM customer_year GROUP BY OID -- 同一OID下同时存在异常和正常年份 HAVING MAX(is_abnormal) = 1 AND MIN(is_abnormal) = 0 ) ORDER BY cy.OID, cy.is_abnormal;
原SQL的不足说明
原SQL仅通过GROUP BY OID HAVING COUNT(OID) > 1筛选OID重复的记录,会把所有OID重复的条目(包括多个正确年份的重复)都返回,无法精准定位你需要清理的「一错一对」的重复数据。
内容的提问来源于stack exchange,提问作者JurajC
相关产品推荐
相关产品推荐

