合并事实表是什么
合并事实表指把粒度与维度一致的多源事实合并成一张表:多渠道订单、多系统支付流水合成一张,用来源列区分。收益有三:查询不必写冗长的 UNION、指标口径只维护一套、出现问题能按来源追溯到系统。前提是各源的粒度与字段语义完全对齐——粒度不同的源直接合表,使用方会默认按统一口径理解,错误会静默传播。
基本信息
| 前提 | 各源粒度一致、维度键可比、字段语义对齐 |
|---|---|
| 区分手段 | 来源维度列,如 src_system 或 channel_type |
| 收益 | 查询简化、口径统一、来源可追溯 |
| 校验 | 合表前后按来源分组核对行数与金额 |
| 边界 | 粒度不同的源不得直接合表,先汇聚到同一粒度 |
典型使用场景
- 全渠道订单:线上、门店、分销渠道的订单合成一张事实表
- 多系统支付:自建收银与第三方支付的流水合并,用来源列区分
- 集团合并:多个子公司口径一致的交易数据合并做整体分析
- 历史与增量拼接:老系统数据与现系统数据统一结构后合并
- 口径统一:此前各源各自建表,报表口径分叉,合并后只维护一套
- 来源分析:按渠道拆分看各来源的规模与质量
来源维度与合并校验
来源维度与合并校验
-- 合并表用来源列区分,查询不必写 UNION ALL
SELECT src_system, count(1) AS rows_cnt, sum(amt) AS amt
FROM fact_order_all
WHERE dt = '2026-10-11'
GROUP BY src_system;
-- 合表前后校验:各来源行数与金额必须一致
SELECT 'merged' AS chk, src_system, count(1) AS cnt, sum(amt) AS amt
FROM fact_order_all WHERE dt = '2026-10-11' GROUP BY src_system
UNION ALL
SELECT 'source_a', 'A', count(1), sum(amt) FROM ods_order_a WHERE dt = '2026-10-11';合并条件对照
| 条件 | 满足才可合并 | 不满足的做法 |
|---|---|---|
| 粒度一致 | 同一业务事件定义相同 | 先汇聚到统一粒度再合 |
| 维度键可比 | 都关联同一套一致性维度 | 先做维度映射或交叉引用 |
| 字段语义一致 | 金额都含税或都不含税 | 加口径标注列,不强行同列 |
| 来源可区分 | 有来源维度列 | 补来源列后再合 |
| 时效一致 | 更新频率可接受 | 保持两表,用视图合并 |
合并事实表最大的风险是把「合表」误当成「口径统一」:把两个语义不同的金额列放进同一列,表是合了,但每个数字的含义取决于来源,反而比不合表更难用。合表前先核对各源字段语义,含税口径、币种、计量单位这类差异必须先归一或加列标注。