如何通过SELECT查询修正违反函数依赖A->B的SQL脏数据
基于函数依赖A->B的SQL数据清洗实现方案
核心逻辑为将原表与A对应的正确B值映射做关联,用正确B值替换原表错误B值即可,以下是两种常见场景的标准SQL实现:
场景1:已提前生成A对应的正确B映射表
假设你已经将确认好的A到正确B的映射存储在名为correct_ab_map的表中,表包含A、correct_B两个字段,直接关联查询即可得到清洗结果:
SELECT t.A, m.correct_B AS B FROM 你的原表名 t INNER JOIN correct_ab_map m ON t.A = m.A;
场景2:未提前生成映射表,按出现频率最高的B作为正确值
你示例中的正确B刚好是同A下出现次数最多的值,这种场景可以用标准SQL窗口函数动态计算正确映射,无需提前建映射表:
WITH ab_freq AS ( -- 统计每个A下每个B的出现频次 SELECT A, B, COUNT(*) AS freq, -- 同A下按频次倒序排序,频次相同时按B字典序取第一个,避免结果不稳定 ROW_NUMBER() OVER (PARTITION BY A ORDER BY COUNT(*) DESC, B ASC) AS rn FROM 你的原表名 GROUP BY A, B ), correct_map AS ( -- 取每个A下频次最高的B作为正确值 SELECT A, B AS correct_B FROM ab_freq WHERE rn = 1 ) -- 关联原表替换B值得到清洗结果 SELECT t.A, m.correct_B AS B FROM 你的原表名 t INNER JOIN correct_map m ON t.A = m.A;
如果使用的数据库不支持CTE语法,将上述子查询嵌套到FROM子句中即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者user15547357
相关产品推荐
相关产品推荐

