4. 设备主数据质量剖析实战
设备主数据质量剖析的目标不是“看一眼数据”,而是用可复现的查询把隐藏在字段里的问题变成可量化、可定位、可交接的证据。本节以设备主数据表 EQ_MASTER 为例,围绕抽样、SQL profiling、字段分布、异常值检测和质量报告生成,走完一次完整的剖析闭环。示例中的表名、字段名、阈值和结果均为教学假设,实际执行时应替换为真实环境中的对象与参数。
一、先抽样,再决定剖析范围
设备主数据往往有几十万到上百万行,直接全表扫描既慢又容易掩盖局部问题。抽样不是随便取几行,而是按剖析目的选择策略:
- 随机抽样:用于估计整体字段完整率、唯一率等全局指标,例如
ORDER BY RAND() LIMIT 5000(MySQL 语法,示例)。 - 分层抽样:按设备类别、工厂、来源系统分层,每层各取一定比例,避免某类设备被整体忽略。
- 定向抽样:专门抽取最近 30 天新增或修改的记录,用于发现新录入数据的质量问题。
抽样后先做一次“数据体检”:统计行数、主键重复数、关键字段空值数。例如:
SELECT COUNT(*) AS total_rows,
COUNT(DISTINCT EQUIP_ID) AS distinct_id,
SUM(CASE WHEN EQUIP_NAME IS NULL OR TRIM(EQUIP_NAME)='' THEN 1 ELSE 0 END) AS name_null_cnt,
SUM(CASE WHEN LOCATION_ID IS NULL THEN 1 ELSE 0 END) AS loc_null_cnt
FROM EQ_MASTER_SAMPLE;
若 total_rows=5000、distinct_id=4987,说明样本内已有 13 条主键重复;name_null_cnt=210 表示设备名称缺失率约 4.2%。这些数字就是后续质量报告的第一批证据。
二、SQL profiling:把字段“画像”出来
Profiling 的核心是对每个字段计算一组统计量:非空率、唯一率、最大/最小长度、枚举值分布、格式匹配率。以设备名称 EQUIP_NAME 为例:
SELECT COUNT(*) AS total,
COUNT(EQUIP_NAME) AS non_null,
COUNT(DISTINCT EQUIP_NAME) AS distinct_val,
MIN(LENGTH(EQUIP_NAME)) AS min_len,
MAX(LENGTH(EQUIP_NAME)) AS max_len,
AVG(LENGTH(EQUIP_NAME)) AS avg_len
FROM EQ_MASTER_SAMPLE;
假设结果为:total=5000、non_null=4790、distinct_val=4310、min_len=2、max_len=120、avg_len=18.6。这里有两个信号:一是非空率 95.8%,二是最大长度 120 远超平均值,说明存在异常长名称,可能是把描述、备注甚至整段说明误填进了名称字段。Profiling 的价值就在于把“感觉有问题”变成“长度分布右偏、存在离群点”。
三、字段分布分析:看集中度与枚举合理性
对分类字段,分布分析比均值更有意义。例如设备状态 STATUS 的分布:
SELECT STATUS, COUNT(*) AS cnt,
ROUND(COUNT(*)*100.0/SUM(COUNT(*)) OVER(),2) AS pct
FROM EQ_MASTER_SAMPLE
GROUP BY STATUS
ORDER BY cnt DESC;
假设输出为:RUNNING 3120 (62.4%)、STOPPED 980 (19.6%)、MAINT 610 (12.2%)、UNKNOWN 210 (4.2%)、NULL 80 (1.6%)。这里 UNKNOWN 与 NULL 合计 5.8%,属于需要跟进的“状态不明”设备;如果业务规则规定状态只能取 RUNNING/STOPPED/MAINT 三值,那么 UNKNOWN 和 NULL 就是明确的脏数据。对设备类别、工厂代码等字段同样处理,可以快速发现“某工厂代码出现 37 种取值,但标准字典只有 12 种”这类字典外值问题。
四、异常值检测:规则 + 统计双通道
异常值检测建议同时使用规则通道和统计通道。规则通道针对明确约束,例如:设备编号必须匹配 ^EQ[0-9]{8}$;投运日期不得晚于当前日期;功率字段必须大于 0。统计通道则用分位数和 IQR 识别离群点:
-- 计算功率字段 P_RATING 的 Q1、Q3 与 IQR 边界
SELECT
MAX(CASE WHEN pct <= 0.25 THEN P_RATING END) AS q1,
MAX(CASE WHEN pct <= 0.75 THEN P_RATING END) AS q3
FROM (
SELECT P_RATING,
PERCENT_RANK() OVER (ORDER BY P_RATING) AS pct
FROM EQ_MASTER_SAMPLE
WHERE P_RATING IS NOT NULL
) t;
假设 Q1=15、Q3=75,则 IQR=60,上界为 75+1.5×60=165,下界为 15-1.5×60=-75。任何 P_RATING>165 的记录都进入异常清单。若某条记录功率为 9800,而设备类别是“小型水泵”,则几乎可以判定为录入错误或单位混淆(kW 与 W 混用)。异常值不一定都要删除,但必须逐条给出判定结论:错误、合法极端值、待确认。
五、质量报告生成:把发现变成可执行清单
质量报告不是把查询结果堆在一起,而是按“问题—证据—影响—建议”组织。下面给出一份可直接参考的报告结构示例(字段与数值均为教学假设):
| 问题编号 | 字段 | 问题类型 | 证据(样本) | 影响 | 建议动作 |
|---|---|---|---|---|---|
| Q-01 | EQUIP_ID | 主键重复 | 13 条重复,涉及 6 组 | 关联工单时可能串号 | 按创建时间保留最早记录,其余合并 |
| Q-02 | EQUIP_NAME | 缺失 + 超长 | 缺失 210 条;最大长度 120 | 检索与报表不可用 | 补录;超长记录截断并回写备注字段 |
| Q-03 | STATUS | 字典外值 | UNKNOWN 210、NULL 80 | 状态统计失真 | 按最近工单状态回填,无法判定则标记待确认 |
| Q-04 | P_RATING | 统计离群 | 17 条超出上界 165 | 容量分析偏差 | 逐条核对单位与量纲,修正后复算 |
报告生成后,建议把每条问题对应的 SQL 查询一并存档,形成“问题—查询—结果”的可追溯链。这样下一次剖析时,只需替换样本表名或时间范围,就能快速复现并对比质量趋势。
整条链路的关键在于:抽样决定剖析的视野,profiling 和分布分析把字段问题量化,异常值检测把离群记录挑出来,质量报告把发现转化为可执行动作。每一步都保留 SQL 和结果快照,下一次剖析就能在同一口径下对比质量变化,而不是每次从零开始“感觉数据有问题”。