累积快照事实表

累积快照在一个流程实例(如订单)上记录各里程碑时间戳与当前状态,随流程推进被更新;用于计算阶段耗时、流转率与超时监控。

累积快照事实表是什么

累积快照是 Kimball 三类事实表中的第三种(另两类是事务事实表与周期快照),它在一个流程实例上记录各里程碑时间戳与当前阶段:一笔订单的下单、支付、发货、签收时间各占一列,流程每推进一步就更新同一行。它回答的是「这条流程走到哪了、每段用了多久」,是阶段耗时分析、漏斗转化与超时监控的基础表。

基本信息

粒度一个流程实例一行(订单、工单、审批单)
结构多个里程碑时间戳列 + 当前阶段 + 若干度量
更新方式阶段推进时更新同一行,属于可变事实表
典型度量各阶段耗时、总时长、是否超时
对比周期快照周期快照看某一刻的存量,累积快照看一条流程的全生命周期
不支持 UPDATE 时用新增分区加合并取最新的方式模拟,需保证合并逻辑幂等

典型使用场景

  • 履约时效分析:从支付到发货、发货到签收各段耗时的分布
  • 阶段漏斗:各阶段之间的转化率与流失节点定位
  • 超时监控:承诺时限内未推进到下一阶段的订单清单
  • 流程瓶颈分析:找出耗时最长的环节,为优化提供依据
  • 客服支持:单笔订单当前处于哪个阶段、已停留多久

订单累积快照

订单累积快照
CREATE TABLE fact_order_flow (
  order_id BIGINT, user_sk BIGINT,
  create_ts TIMESTAMP, pay_ts TIMESTAMP,
  ship_ts TIMESTAMP, sign_ts TIMESTAMP,
  current_stage STRING
) PARTITIONED BY (dt STRING);

-- 只补空白列,天然幂等:重复执行不会把已推进的阶段改回去
UPDATE fact_order_flow
SET pay_ts = '2026-10-11 10:20:00', current_stage = 'paid'
WHERE order_id = 1001 AND pay_ts IS NULL;

阶段耗时与超时清单

阶段耗时与超时清单
-- 各阶段耗时:仅统计已完成的阶段
SELECT dt,
       AVG(TIMESTAMPDIFF(MINUTE, create_ts, pay_ts))  AS pay_min,
       AVG(TIMESTAMPDIFF(MINUTE, pay_ts, ship_ts))    AS ship_min
FROM fact_order_flow
WHERE dt = '2026-10-11' AND pay_ts IS NOT NULL AND ship_ts IS NOT NULL
GROUP BY dt;

-- 超时清单:已支付但 24 小时未发货
SELECT order_id, pay_ts, current_stage
FROM fact_order_flow
WHERE dt = '2026-10-11'
  AND pay_ts IS NOT NULL AND ship_ts IS NULL
  AND pay_ts < DATE_SUB(NOW(), INTERVAL 24 HOUR);

三类事实表对照

类型一行代表典型用途
事务事实表一次业务事件发生额、笔数等可加度量
周期快照事实表某周期某实体的状态存量分析、日均余额
累积快照事实表一个流程实例的全生命周期阶段耗时、漏斗、超时监控
更新语义必须幂等:只补空白时间戳,不做无条件覆盖,否则重跑会把已签收的订单打回发货中,时效指标随之全部失真。
存储引擎不支持 UPDATE 时(部分 Hive 表),可以按天新增分区保存最新状态,查询时取最新分区;代价是要保证合并逻辑幂等,且读取端必须知道去哪一天取数。

易错点

  • 只存当前状态不存各阶段时间戳,无法回溯阶段耗时,只能事后凭日志推算
  • 更新语义不做幂等处理,重跑把已签收订单打回发货中
  • 时间戳列缺空值兜底,未到达的里程碑用默认值填充,耗时统计出现负值
  • 用累积快照代替事务事实表统计当天发生量,把流程状态当成流水
  • 分区设计照搬周期快照,导致同一订单在多天分区各有一行,去重规则复杂

数据来源与参考

  • Kimball《The Data Warehouse Toolkit》累积快照事实表
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌