账户余额日快照案例
账户余额日快照是周期快照事实表的典型实现:粒度是账户乘以日,度量按期初余额、当日发生额、期末余额三列存放,三者满足期末等于期初加发生额的勾稽关系。余额是半可加指标——跨账户可加,跨时间不可加。所以「某天总余额」要取当天各行求和,「本月平均余额」要按日先汇总再平均,绝不能把多天的期末余额相加。
基本信息
| 粒度 | 账户乘以日,一天一账户一行 |
|---|---|
| 度量列 | 期初余额、发生额、期末余额 |
| 可加性 | 跨账户可加,跨时间不可加(半可加) |
| 勾稽关系 | 期末 = 期初 + 发生额 |
| 写入方式 | 按日分区覆盖,重跑可复现 |
典型使用场景
- 日终余额报表:任意日期直接取当日行,不用做累计计算
- 资金流分析:按账户、机构、产品维度汇总当日余额与变动
- 风控监控:识别余额异常波动、长期零余额与透支账户
- 计息与对账:期初、发生、期末三列是利息计算的基础输入
- 时点快照对比:期初与期末留存同一格式,便于跨期比对
建余额快照与勾稽校验
建余额快照与勾稽校验
CREATE TABLE fact_account_balance_daily (
dt string COMMENT '账务日期',
account_sk bigint COMMENT '账户代理键',
open_bal decimal(18,2) COMMENT '期初余额',
change_amt decimal(18,2) COMMENT '当日发生额净额',
close_bal decimal(18,2) COMMENT '期末余额'
) PARTITIONED BY (dt) STORED AS ORC;
-- 勾稽校验:不平衡即阻断当日加载
SELECT count(1) AS bad_cnt FROM fact_account_balance_daily
WHERE dt = '2026-10-12' AND close_bal <> open_bal + change_amt;查询方式与可加性
| 查询 | 正确做法 | 错误做法 |
|---|---|---|
| 某日总余额 | 取当天行求和 | 把多天期末余额相加 |
| 本月平均余额 | 先按日汇总再平均 | 直接对全部行求平均 |
| 余额变动 | 用期末减期初或取发生额列 | 用期末余额相减跨多天 |
| 账户维度上卷 | 按机构汇总当日行 | 跨账户与跨日期一起求和 |
期初余额应等于上一日的期末余额,这条跨日一致性检查比单日勾稽更能发现问题:单日勾稽可能因为期初与发生额同步出错而「恰好」平掉,跨日比对则会把差异暴露在日期边界上。
没有当日交易的账户是否落行必须事先约定。落行才能保证账户数口径稳定,不落行则每日账户数忽多忽少;若选择不落行,则「当日有余额的账户数」这类指标必须用最近一次快照向前填充,不能直接计数。