首页/数据/数仓建模速查/订单流程累积快照案例
维度与事实设计149 条

订单流程累积快照案例

订单生命周期(下单-支付-发货-签收)用累积快照一行一单:各节点时间戳 + 各段耗时;未完成节点为空,用于时效与漏斗分析。

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

累积快照的定位

订单生命周期(下单、支付、发货、签收)适合用累积快照事实表承载:一行对应一个订单,各节点的时间戳记录在同一行上,随事件发生被反复更新。它与事务事实表逐事件追加不同,把跨天完成的同一笔业务收拢成一行,天然适合履约时效与订单漏斗分析。

基本信息

粒度一个订单一行,订单号为主键
节点列create_ts、pay_ts、ship_ts、sign_ts
派生列支付时长、发货时长、签收时长、超期标记
更新方式按订单号 upsert,节点列只填空值不覆盖已有值
平台差异Hive 需要 T+1 合并覆盖;Doris 与 MySQL 支持唯一键 upsert

典型使用场景

  • 履约时效考核:支付到发货、发货到签收的分段耗时,按仓库与商家汇总
  • 订单漏斗分析:各节点到达率即转化率,未到达的节点为空,可直接算流失量
  • 超期预警:承诺时效内未签收的订单筛出来,推送客服与仓储跟进
  • 取消与关闭分析:取消时间单独成列,判断取消集中在前段还是后段
  • 补数重跑:迟到订单到达后重跑当天分区,靠订单号幂等覆盖

累积快照建表与合并

累积快照建表与合并
-- 一行一单:节点时间戳为空表示该节点尚未到达
CREATE TABLE fact_order_flow (
  order_id  string COMMENT '订单号',
  create_ts timestamp COMMENT '下单时间',
  pay_ts    timestamp COMMENT '首次支付成功时间',
  ship_ts   timestamp COMMENT '首次发货时间',
  sign_ts   timestamp COMMENT '签收时间',
  cancel_ts timestamp COMMENT '取消时间,与签收互斥'
) PARTITIONED BY (dt string) STORED AS ORC;

-- 合并时旧值不能被新批次的空值抹掉
MERGE INTO fact_order_flow t USING stg_order_flow s
ON t.order_id = s.order_id
WHEN MATCHED THEN UPDATE SET t.pay_ts = coalesce(s.pay_ts, t.pay_ts);

节点与派生指标

节点或派生列含义异常表现
pay_ts首次支付成功时间为空但订单已关闭,说明支付从未成功
ship_ts首次出库发货时间长期为空说明仓库积压或单据未推送
sign_ts签收时间为空要区分未签收与回传延迟,否则签收率虚低
pay_dur支付时长等于支付时间减下单时间出现负值或极大值说明时钟不一致或数据回放
超期标记按承诺时效派生判定口径变化会让超期率整段跳变
节点时间取首达时间:支付重试、拆单多次发货都只记第一次,否则耗时被反复拉长,时效考核结果会随重试次数波动。
取消单与关闭单要单独标记并排除在时效样本之外,混进样本会让履约时效看起来比实际更好,掩盖真实超期问题。

易错点

  • 节点时间取末次而非首次:多次发货覆盖首次发货时间,履约耗时被拉长,考核口径整体偏高
  • 取消单混入时效样本:履约时效被人为拉低,指标偏乐观
  • 当日只写新节点不回写历史分区:同一订单在多个分区各有一行,主键唯一性被破坏
  • 上游重发未按订单号去重合并:同一订单出现多行,漏斗到达率超过百分之百
  • 节点列被上游宽表的空值覆盖:补传数据缺少历史节点时,已记录的签收时间被抹掉

数据来源与参考

  • 数据仓库工具箱:累积快照事实表
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌