维度与事实设计149 条

半可加度量

部分维度可加、部分不可加:余额、库存、人数在账户/商品维上可加,在时间维上不可加,跨时间需取期末、期初或平均口径。

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

半可加度量是什么

半可加度量指在部分维度上可加、在时间维度上不可加的量:账户余额在不同账户之间可以相加得到总余额,但把某账户连续 30 天的余额加总没有任何业务含义;库存、人数、在保件数同理。这类度量必须配套口径声明——期末、期初、日均还是最大值,不同口径算出的数字不同,报表要明确标注而不能指望使用方默认理解。

基本信息

不可加维度时间(跨时间求和无语义)
常见口径期末值、期初值、日均、区间最大值
实现方式窗口函数、取特定时点、或预先算好
存储形态通常落在周期快照事实表上
声明要求口径写入字段名或指标注释,禁止隐式默认

典型使用场景

  • 账户余额:期末余额与日均余额是财务与风控的两个不同指标
  • 库存水平:期末库存、日均库存与周转天数
  • 会员人数:月末在册人数不可跨月相加
  • 在保与在职:保险在保件数、企业在职人数按月统计
  • 设备在线数:每日在线设备数,月度看月日均或月末值
  • 授信与额度:剩余额度按期末取值,跨月求和没有意义

期末、期初与日均

期末、期初与日均
-- 期末余额:取区间内最后一个有数据的日期
SELECT account_id, balance
FROM   fact_account_balance_daily
WHERE  dt = (SELECT max(dt) FROM fact_account_balance_daily
             WHERE dt <= '2026-10-11');

-- 期初余额:取区间内第一个有数据的日期
SELECT account_id, balance
FROM   fact_account_balance_daily
WHERE  dt = (SELECT min(dt) FROM fact_account_balance_daily
             WHERE dt >= '2026-10-01');

-- 日均余额:按账户先平均,再跨账户汇总
SELECT avg(daily_balance) FROM (
  SELECT account_id, avg(balance) AS daily_balance
  FROM   fact_account_balance_daily
  WHERE  dt BETWEEN '2026-10-01' AND '2026-10-11'
  GROUP  BY account_id) t;

口径与含义对照

口径取值方式常见用途
期末值区间最后一天的快照对外披露、监管报送
期初值区间第一天的快照与上期期末对齐核对
日均值按实体先平均再汇总资源占用、成本分摊
区间最大值取区间内峰值容量规划、风控峰值
区间平均余额合计法用日均余额之和算利息基数利息与费用计算
判断某度量是否半可加,最快的办法是问一句「跨时间加总讲不讲得通」。讲不通的都要显式给口径,并在报表标题或字段名里体现,例如写成期末余额、日均余额,而不是笼统的余额。

易错点

  • 直接把每日余额或库存求和:数字看起来合理,业务上却毫无意义
  • 平均口径未声明被当期末值使用:同一指标两种读法,跨部门对不上账
  • 先跨账户求和再按天平均:与按账户先平均再汇总的日均口径结果不同,需提前定口径
  • 把半可加度量放进聚合事实表的求和列:上卷时自动累加,输出错误结果
  • 缺失日期未补快照:期末取到上一天的余额,报表看着正常实际已过期

数据来源与参考

  • 数据仓库工具箱:度量
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌