本文转载自今日头条,作者:数字的猫。原文链接:

[[数据清洗]] [[SQL学习笔记]]

做数据分析最烦的,很多时候不是建模,也不是画图,而是前面的脏活:洗数据。

姓名前后带空格,手机号混着短横线和区号,日期一会儿是 2026-04-01,一会儿又变成 2026/04/01。你要是不先把这些问题处理掉,后面的统计口径、指标分析、画像建模,基本都会歪。

很多人一提数据清洗,第一反应就是 Python。可在大量日常场景里,SQL 其实更直接:离数据近、处理快、适合批量操作,很多问题在库里顺手就能解决。

这篇我不讲虚的,直接给你 20 段我觉得最常用、最值得收藏的 SQL 数据清洗代码。不是冷门技巧大全,而是高频实战清单。

先说清楚两点:

  • ✅ 文中 SQL 我已经按 SQLite 3.51.0 在本机逐条执行验证通过。

  • ⚠️ 如果你线上用的是 MySQL、PostgreSQL、SQL Server 或 Oracle,函数名和日期处理写法可能需要按数据库方言微调后再上线。

1)去掉字段首尾空格

这个问题太常见了。姓名、部门名、商品名、证件号,导入 Excel 或人工录入后,经常前后带空格。

如果你想直接更新原表:

2)把空字符串统一成 NULL

很多系统表面上“不是空值”,其实存的是空字符串。后面统计缺失值时,这种数据最烦。

这个动作做完,后面再算缺失率就干净多了。

3)替换特殊字符

有些字段里会混进换行、回车、全角空格,肉眼不一定看得出来,但分组统计时就会出问题。

如果是备注字段,这一步尤其值得先做。

4)统一大小写

邮箱、工号编码、课程代码这类字段,经常一部分大写、一部分小写。后面做匹配时,不统一就容易丢数据。

5)修正日期格式

同一张表里日期格式不统一,是最常见的数据源问题之一。

这段适合处理 2026/04/01 和 2026-04-01 这类常见混用格式。

6)统一性别字段口径

这个场景你肯定见过:男 / 女 / M / F / 1 / 2 / 未知 / 空值 混在一起。

这种字段一定要尽早标准化,不然后面画像分析会非常难受。

7)补默认值

有些缺失值不适合一直保留 NULL,比如状态字段、标志字段。

如果是数值字段,也可以这样写:

8)去重:保留最新一条记录

这一段我真的高频用。

同一个用户、同一个订单、同一个学生,重复导入多次是非常常见的问题。很多人第一反应是 distinct,但真正好用的,往往是窗口函数。

你只要把“按谁分组”和“按什么排序保留最新”换掉,就能处理很多重复数据问题。

9)找出重复记录

不是所有重复都要直接删,很多时候要先查出来给业务确认。

这段特别适合先做巡检。

10)手机号标准化和脱敏

手机号经常带空格、短横线,甚至前面带区号。

如果你要展示脱敏结果:

11)身份证号校验长度

身份证号这种字段,最基本的一步就是先查长度异常。

先把明显错的筛出来,再谈后面的年龄、性别解析。

12)从身份证号提取出生日期

如果身份证号质量还可以,这一步很方便。

⚠️ 这段依赖身份证号本身真实有效,不能把它当成绝对正确的数据源。

13)计算年龄分层

年龄不是直接存的,通常要从出生日期推。

这类“衍生字段清洗”在画像和统计里特别常见。

14)筛异常值

有些成绩字段、消费字段、学分字段,可能出现明显不合理的数据。

更稳妥的做法通常不是直接改,而是先筛出来。

如果确实要兜底:

⚠️ 异常值是否要截断,必须先问清业务规则,不能技术人员自己拍脑袋决定。

15)类别字段映射成统一口径

学历层次、会员等级、订单状态、部门类别,经常存在别名和历史写法。

如果映射规则很多,建议单独维护码表,不要把所有逻辑都硬写在 CASE WHEN 里。

16)多表关联前先清洗关联键

很多 JOIN 对不上,不是表没关系,而是关联键脏了。

经验上讲,JOIN 前先对学号、工号、身份证号做一轮 trim(),能少掉很多莫名其妙的问题。

17)识别缺失率

清洗前,先知道哪一列最脏。

这段很适合做字段质量画像。

18)统一布尔字段

很多系统里的“是否激活”“是否删除”“是否有效”字段特别乱。

统一成 0/1 后,后面的统计和建模都会省很多事。

19)拆分复合字段

有些源表喜欢把多个信息塞在一个字段里,比如“学院-专业-班级”或者“省份-城市-门店”。

这种字段不拆,后面几乎没法做严肃分析。

20)建一个清洗视图,别每次重写

很多人写 SQL 清洗最大的问题,不是不会写,而是每次都从头写一遍。

如果某张表是高频使用的,建议直接建一个清洗视图:

这样后面做报表、做标签、做专题分析时,直接查视图就行,不用每次重新洗。

最后说几句真经验

如果你平时就在做数据分析、报表开发或数据治理,我的建议就四句:

第一,别一上来就想着“把所有问题一次洗干净”。

先抓高频字段:主键、姓名、手机号、日期、状态、编码、类别。把这些核心字段洗顺了,后面大部分分析就能跑起来。

第二,能用码表解决的,不要全写死在 CASE WHEN 里。

规则一多,SQL 会越来越难维护。

第三,异常值先查再改。

很多时候你以为是脏数据,其实是业务规则特殊。

第四,清洗不是一次性动作。

更理想的做法不是“分析前临时洗一次”,而是把高频规则沉淀成视图、宽表、清洗层,慢慢变成稳定的数据底座。

说到底,SQL 数据清洗没有什么玄学。

你真正需要的,不是 200 个冷门函数,而是把高频脏问题反复收敛的能力。

如果这篇对你有帮助,建议先收藏。

后面真遇到脏数据时,再回来按场景翻就行。

你平时最常碰到的数据清洗问题是哪一种?

空值、重复值、日期格式混乱,还是多表 JOIN 对不上?