4. 数据质量维度:完整性、准确性、一致性、时效性、唯一性——针对价格字段的专项检查
在采购支出数据仓库中,价格字段(如单价、含税价、运费分摊价)是财务核算与支出分析的核心。ETL 过程中,价格数据必须通过完整性、准确性、一致性、时效性、唯一性五个维度的专项检查,才能进入事实表。以下针对每个维度定义检查规则、异常处理策略及度量指标。
4.1 完整性(Completeness)
完整性检查确保价格字段不存在空值或缺失。缺失价格将导致支出金额无法计算,直接破坏聚合分析。
| 检查项 | 规则描述 | 异常处理 |
|---|---|---|
| 单价非空 | 采购明细行中 unit_price 不得为 NULL 或 0 |
标记为“价格缺失”,回填默认值(如合同价或最近采购价)并写入异常日志 |
| 含税价非空 | tax_included_price 不得为 NULL |
根据税率与单价自动计算补全,并记录“自动推算”标记 |
| 币种必填 | currency_code 不得为空 |
按采购组织默认币种填充,写入异常表 |
实践建议:完整性检查应在源系统抽取后立即执行。对于缺失率超过 5% 的批次,应暂停加载并通知上游业务系统整改。
4.2 准确性(Accuracy)
准确性检查验证价格值是否在合理范围内,是否存在异常跳变或录入错误。价格方差清洗的核心即在于此。
- 范围校验:单价必须在 [0.01, 99999999] 之间,负价格直接拒绝。
- 波动率校验:同一物料在 30 天内价格波动超过 ±30% 时,触发人工审核。
- 单位一致性校验:价格单位(如“元/个”与“元/箱”)必须与物料主数据匹配,防止因单位错位导致的价格偏差。
准确性检查示例 SQL:
-- 标记价格波动异常记录
SELECT
purchase_order_id,
material_id,
unit_price,
LAG(unit_price) OVER (PARTITION BY material_id ORDER BY order_date) AS prev_price,
ABS(unit_price - LAG(unit_price) OVER (PARTITION BY material_id ORDER BY order_date))
/ NULLIF(LAG(unit_price) OVER (PARTITION BY material_id ORDER BY order_date), 0) AS price_change_pct
FROM source_purchase_detail
WHERE ABS(unit_price - LAG(unit_price) OVER (PARTITION BY material_id ORDER BY order_date))
/ NULLIF(LAG(unit_price) OVER (PARTITION BY material_id ORDER BY order_date), 0) > 0.30;
4.3 一致性(Consistency)
一致性检查确保同一业务含义的价格在不同系统或同一系统不同时间点的表达方式统一。价格字段常见的不一致问题包括:
| 不一致类型 | 示例 | 对齐规则 |
|---|---|---|
| 币种不一致 | 同一采购单同时出现 CNY 与 USD | 按采购组织本位币统一转换,保留原始币种作为参考 |
| 含税/不含税口径不一致 | 部分源系统存储含税价,部分存储不含税价 | 统一转换为不含税价,税率字段单独存储 |
| 价格精度不一致 | A 系统保留 2 位小数,B 系统保留 4 位小数 | 统一四舍五入到 2 位小数,并记录原始精度 |
4.4 时效性(Timeliness)
时效性检查关注价格数据是否在预期时间窗口内到达并加载。延迟的价格数据会导致报表失准,尤其在动态定价场景下。
- 加载延迟阈值:采购订单价格应在订单确认后 24 小时内进入 ODS 层。
- 价格有效期检查:价格记录必须关联有效的时间范围(
valid_from/valid_to),过期价格不得用于当前期间分析。 - 批处理窗口监控:ETL 批处理若超过 SLA(如 30 分钟),触发告警并记录延迟原因。
常见陷阱:部分源系统在月末批量补录采购单,导致价格数据集中延迟到达。建议在 ETL 调度中设置“月末缓冲窗口”,允许延迟 48 小时,但需在数据质量报告中明确标注“延迟加载”标记。
4.5 唯一性(Uniqueness)
唯一性检查确保同一采购行项目不会因重复抽取或源系统重复录入而产生多条价格记录。重复价格会导致支出金额被重复计算。
| 检查粒度 | 唯一键定义 | 去重策略 |
|---|---|---|
| 采购明细行 | purchase_order_id + line_item_id + version |
保留最新版本(按 last_modified_date 降序) |
| 合同价格主数据 | contract_id + material_id + effective_date |
同一生效日期内仅保留一条记录,重复时取最高审批版本 |
去重示例 SQL(窗口函数):
WITH ranked_prices AS (
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY purchase_order_id, line_item_id
ORDER BY last_modified_date DESC, version DESC
) AS rn
FROM source_purchase_detail
)
SELECT * FROM ranked_prices WHERE rn = 1;
4.6 五维度综合度量矩阵
为量化价格数据质量,建议在 ETL 中建立以下度量指标,并写入数据质量监控表:
| 维度 | 度量指标 | 目标阈值 | 告警阈值 |
|---|---|---|---|
| 完整性 | 价格缺失率 | < 1% | > 5% |
| 准确性 | 价格波动异常率 | < 2% | > 8% |
| 一致性 | 币种/口径不一致率 | 0% | > 0.5% |
| 时效性 | 延迟加载占比 | < 3% | > 10% |
| 唯一性 | 重复记录率 | 0% | > 1% |
通过以上五个维度的专项检查,价格字段在进入数据仓库前将具备可审计、可追溯、可度量的质量保障。下一阶段将基于清洗后的价格数据,进行方差计算与异常模式识别。