数仓中可加、半可加和不可加指标怎么理解?
面试怎么回答
可加指标如金额和数量,通常能沿时间、地区等维度求和;半可加指标如余额和库存,只能沿部分维度相加,沿时间要取期末、平均或峰值;不可加指标如比率和去重人数,必须回到底层分子分母或明细集合重新计算。建模时我会先声明事实粒度,保存可组合的原子事实,并把时间语义和聚合公式写进指标定义。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
业务提出:“把每天账户余额加起来看月度余额。”
SQL 很容易写,结果却没有业务意义。
指标能不能加,不取决于字段是不是数字,而取决于事实粒度以及沿哪个维度聚合。
可加指标:可以沿大多数维度求和
订单金额、销售数量、曝光次数通常属于可加指标。
在事实粒度一致、币种和口径一致的前提下,它们可以沿时间、商品、地区等维度汇总。
但“可加”也不是无条件的。不同币种金额、含税与未税金额、新旧口径数据不能直接相加。技术上的 SUM 正确,不代表业务口径正确。
半可加指标:只在部分维度可加
余额、库存、账户数快照是典型半可加指标。
同一天不同门店的库存可以相加,但同一门店 30 天的日末库存不能相加当作月库存。沿实体维度可加,沿时间维度通常要取期末、期初、平均值或峰值。
因此,半可加指标必须同时定义时点语义:月末余额、日均余额和期间最大余额是三个不同指标。

不可加指标:必须回到底层重新计算
转化率、客单价、利润率、去重用户数通常不可直接求和。
两个渠道转化率不能简单相加,也不应该直接求平均。正确方式是先汇总分子和分母,再计算整体比率。
去重人数更加明显:两个分区各有 100 个用户,不代表合并后一定是 200 个,因为用户集合可能重叠。
建模时优先保存可组合事实
事实表应尽量保存订单金额、访问次数、转化次数等原子或可组合数据,而不是只保存已经计算好的比率。
对于余额类指标,可以使用周期快照事实表并明确快照时点;对于比率类指标,同时保留分子和分母;对于 UV,保留明细、集合结构或明确的去重计算层。
一个典型场景
报表把各广告计划的 ROI 直接平均,得到“整体 ROI”。但不同计划的消耗规模差异很大,小计划对平均值产生了不合理影响。
修正方式是先汇总整体收入和整体成本,再用总收入除以总成本。指标结果变化的根因不是 SQL 函数,而是聚合路径错了。
指标口径必须包含:事实粒度、可加方向、时间语义和重算公式。