周期快照事实表是什么
周期快照是 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 补会把结果拉低。