首页/数据/数仓建模速查/迟到事实(Late-arriving fact)
维度与事实设计149 条

迟到事实(Late-arriving fact)

事实晚于业务时间到达;若按到达时间分区会破坏时间序列对齐,应按业务时间分区,并把迟到量纳入监控与补跑流程。

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

迟到事实是什么

迟到事实指记录晚于它自己的业务发生时间到达数仓:线下门店的小票 T+3 才上传、上游系统积压后批量补推、跨时区业务的日切时间不一致,都会造成这类情况。核心决策是按业务时间还是按到达时间分区。按到达时间分区会让历史分区被反复改写、日报与业务日期错位;按业务时间分区则需要支持回写历史分区,并把迟到窗口与补跑机制显式写进调度。

基本信息

分区依据业务时间(biz_date),不是入库时间
迟到窗口显式声明,如允许 T+3 内补数
补跑方式按分区幂等 upsert,禁止全表重写
监控指标每日迟到行数、最长滞后天数、未落地时长
前置条件事实表保留业务时间字段与唯一业务键

典型使用场景

  • 线下门店数据 T+N 上传:销售小票滞后于交易日期到达
  • 上游系统积压补推:白天中断,晚上一次性把整天的数据送进来
  • 跨时区业务:不同地区的日切时间不同,按本地时间对不上
  • 人工补录与调账:月末集中补录费用、报销与退款
  • 接口重试:对接方在失败后重发,业务时间已过去数天
  • 日志迟到:设备侧离线缓存后批量上报

监控与幂等补跑

监控与幂等补跑
-- 1) 监控:今天入库的行里有多少属于历史业务日期
SELECT biz_date, count(1) AS late_rows
FROM   fact_order
WHERE  dt = current_date
  AND  biz_date < current_date - interval '1' day
GROUP  BY biz_date
ORDER  BY biz_date;

-- 2) 幂等补跑:按业务键 upsert,重跑结果一致
MERGE INTO fact_order t
USING stg_order_late s ON t.order_id = s.order_id
WHEN MATCHED THEN UPDATE SET amt = s.amt
WHEN NOT MATCHED THEN INSERT VALUES (s.order_id, s.biz_date, s.amt);

分区策略对照

策略特点风险
按业务时间分区日报与业务日期对齐,可回溯需要回写历史分区,权限与并发要管
按到货时间分区写入简单、只追加同一业务日数据散落多分区,日报对不上
双分区(业务+到达)兼顾对齐与追责存储翻倍,模型复杂度上升
不分区只按时间过滤小体量最简单数据量上来后扫描成本不可控
迟到数据被过滤规则静默丢弃,是报表对不上账最常见的根因:白天看着正常,月底补录批次一到才暴露。宁可先落到缓冲区并告警,也不要让不满足条件的行无声消失。

易错点

  • 按到货时间分区:同一业务日的数据散在多个分区里,日报口径与业务日期整体错位
  • 迟到数据被规则过滤且无告警:丢的是收入明细,谁都不知道,直到对账才对出来
  • 补跑用全表重写而非按业务键 upsert:重跑一次金额翻倍,且无法与上游核对
  • 不声明迟到窗口:上游以为 T+1 就结束,迟到的数据永远不受理,链路责任也不清晰
  • 业务时间字段被格式化成字符串或时区未统一:迟到判断与分区裁剪同时失效

数据来源与参考

  • 数据仓库工具箱:迟到数据
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌