维度与事实设计149 条

合并事实表

同一粒度的多源事实(多渠道订单、多系统流水)合并为一张表,用来源维度区分,减少 union 查询与指标口径分叉。

数仓建模速查数据更新于 2026-10-13

合并事实表是什么

合并事实表指把粒度与维度一致的多源事实合并成一张表:多渠道订单、多系统支付流水合成一张,用来源列区分。收益有三:查询不必写冗长的 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';

合并条件对照

条件满足才可合并不满足的做法
粒度一致同一业务事件定义相同先汇聚到统一粒度再合
维度键可比都关联同一套一致性维度先做维度映射或交叉引用
字段语义一致金额都含税或都不含税加口径标注列,不强行同列
来源可区分有来源维度列补来源列后再合
时效一致更新频率可接受保持两表,用视图合并
合并事实表最大的风险是把「合表」误当成「口径统一」:把两个语义不同的金额列放进同一列,表是合了,但每个数字的含义取决于来源,反而比不合表更难用。合表前先核对各源字段语义,含税口径、币种、计量单位这类差异必须先归一或加列标注。

易错点

  • 粒度不一致硬合并:使用方按统一口径理解,统计结果出错且难以发现
  • 来源标记缺失:问题数据无法定位到源系统,排查只能人工比对
  • 字段语义未归一(含税与未含税同列):数字含义随行变化,实质不可用
  • 只合表不校验:某来源漏批后总量减少,被当成业务下滑
  • 维度键未做映射直接合表:同名维度来自两套编码,分组结果被拆成两份

数据来源与参考

  • 数据仓库工具箱:事实表设计
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌