周期快照事实表

周期快照按固定周期(常见每天)记录状态与存量:库存量、账户余额、会员等级分布;粒度是周期 × 实体,通常以覆盖写入当日分区的方式生成。

周期快照事实表是什么

周期快照是 Kimball 三类事实表中的一种(另两类是事务事实表与累积快照事实表),按固定周期记录实体在某一刻的状态存量,例如每日库存、每日账户余额、每月会员等级分布。粒度固定为「周期 × 实体」,回答的是「某一刻是什么样」,而事务事实表回答的是「发生了什么」。它必须有日期键,通常以覆盖写当日分区的方式生成。

基本信息

粒度周期 × 实体,如 日期 × 商品 × 仓库
度量特性多为半可加:跨实体可加,跨周期不可加
生成方式每日全量状态覆盖写当日分区,可重跑
时间维度必须带日期键,且是分区裁剪的主要入口
存储量级周期数 × 实体数,量级随保留周期线性增长

典型使用场景

  • 库存与在途量日结:分析周转天数、缺货天数、库龄结构
  • 账户余额日切:算日均余额、存款结构变化
  • 会员等级与分层分布:按天看各等级人数,观察升降级流动
  • 额度与占用类指标:信贷额度占用、仓位与货架占用
  • KPI 趋势:需要「每天的状态」而非「当天发生额」的指标

库存日快照生成

库存日快照生成
-- 每日全量状态覆盖写当日分区,可安全重跑
INSERT OVERWRITE TABLE fact_inventory_daily PARTITION (dt = '2026-10-11')
SELECT date_sk, product_sk, warehouse_sk,
       SUM(on_hand_qty) AS on_hand_qty,   -- 在库量
       SUM(lock_qty)    AS lock_qty       -- 锁定量
FROM ods_inventory_stock
WHERE dt = '2026-10-11'
GROUP BY date_sk, product_sk, warehouse_sk;
-- 校验:分区行数与该日实体数应一致,不出现骤降
SELECT COUNT(1) AS rows_cnt, COUNT(DISTINCT product_sk) AS sku_cnt
FROM fact_inventory_daily WHERE dt = '2026-10-11';

取每月末快照

取每月末快照
-- 月末余额:先取该月最后一个有数据的分区,再关联明细
WITH last_dt AS (
  SELECT MAX(dt) AS dt FROM fact_account_balance_daily
  WHERE dt >= '2026-09-01' AND dt <= '2026-09-30'
)
SELECT b.dt, b.account_id, b.balance
FROM fact_account_balance_daily b
JOIN last_dt d ON b.dt = d.dt;

度量可加性对照

度量类型示例能否跨周期求和
全可加当日销售额、当日交易笔数可以,跨周期跨实体都成立
半可加库存量、账户余额、在册会员数不可以,只能跨实体求和
不可加单价、占比、转化率不可以,先分别求分子分母再相除
库存这类半可加度量跨日期求和没有业务含义:算平均库存要按天求平均,算周转率要用日均库存,不能把多天快照相加当总库存。
周期快照按覆盖写生成,缺失某天分区只代表当天没跑,不代表当日库存为 0;空缺分区在算日均时必须跳过,用 0 补会把结果拉低。

易错点

  • 把多天库存快照直接求和当总库存,得到无意义数字并被写进报表
  • 快照缺失某天分区,计算日均时被当成 0,指标被系统性拉低
  • 快照没有覆盖写、改为追加写,重跑后同一天出现两份状态,指标翻倍
  • 用周期快照代替事务事实表统计当天发生额,把状态变化错误地当成流水
  • 长时间保留全量日快照但未做归档与生命周期,存储成本随周期线性膨胀

数据来源与参考

  • Kimball《The Data Warehouse Toolkit》周期快照事实表
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌