维度与事实设计149 条

不可加度量

任何维度上求和都无意义的度量(比率、单价、毛利率);应存储分子与分母等可加基础度量,由查询端计算目标指标。

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

不可加度量是什么

不可加度量指在任何维度上求和都没有意义的量:毛利率、客单价、转化率、留存率、单价、比率与占比。它们不是可加量,跨渠道、跨品类甚至跨时间相加都得不到正确结果。标准做法是不在事实表存最终比率,只存可加的分子与分母(支付金额与订单数、成交人数与访问人数),由查询端按口径现算,并把口径写进指标定义,避免不同人用不同分母算出不同数字。

基本信息

典型度量毛利率、客单价、转化率、留存率、单价
存储方案只存可加分子与分母,不存最终比率
计算位置查询端或指标层,按需相除
口径要求分子分母定义必须写进指标字典
命名规范rate 后缀表示比率,禁止与其他度量同名

典型使用场景

  • 客单价:支付金额除以订单数,不能对各渠道客单价求平均
  • 毛利率:毛利除以收入,跨品类汇总要重算而不是平均
  • 转化率:下单人数除以访问人数,分子分母来自两张事实
  • 留存率:同期群口径,分母是当期新增,分子是后续仍活跃的人数
  • 单价与均价:件均价按金额除以件数,直接平均会受高价商品权重干扰
  • 占比与份额:某品类占比等于该品类金额除以总额,汇总前必须重算

比率需重算

比率需重算
-- 正确:先汇总分子分母,再相除
SELECT sum(pay_amt) / count(distinct order_id) AS aov
FROM   fact_order
WHERE  dt = '2026-10-11';

-- 错误直观演示:各渠道客单价求平均,与整体客单价不等
SELECT avg(channel_aov) AS wrong_aov
FROM  (SELECT channel,
              sum(pay_amt) / count(distinct order_id) AS channel_aov
       FROM   fact_order WHERE dt = '2026-10-11'
       GROUP  BY channel) t;

-- 环比:两个区间的比率都要各自重算后再比较,不能对结果做减法以外的合并
-- 对比率做 sum 或 avg 都会得到没有业务含义的数字

度量类型对照

类型例子汇总方式
可加金额、件数、次数直接 sum,任意维度都成立
半可加余额、库存、人数除时间外可 sum,跨时间取期末或日均
不可加毛利率、客单价、转化率先汇总分子分母再相除,跨维度必须重算
派生同比增速、环比增速对已算好的指标再做运算,需固定基准口径
只存比率不存分母,后果是后续任何按新维度拆分的需求都得回到明细重算,等于没有复用价值。凡是要进指标体系的比率,都应同时落分子与分母两个可加度量。

易错点

  • 对比率列做 sum 或 avg:得到的数字没有业务含义,却常被当结论使用
  • 只存比率丢了分母:想按新维度拆分时必须重算全量明细,且历史无法回溯
  • 各渠道比率求平均当整体比率:忽略了各渠道规模权重,结论系统性偏移
  • 比率先四舍五入再汇总:舍入误差按规模放大,在大额对账时暴露尾差
  • 口径不写进指标字典:两个团队用不同分母算出两个数,谁也说不清哪个对

数据来源与参考

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