多值维度怎么处理
一个事实行对应维度的多个成员(一笔订单多张券、一篇文章多个标签)称为多值维度。常见三种处理:事实表存分隔串、桥接表、反向事实表。前者无法关联,后两者各有适用面,选择取决于是否需要分摊以及分析的主视角。
基本信息
| 桥接表 | 保存关系与权重,支持分摊与去重统计 |
|---|---|
| 反向事实表 | 以关联成员为主视角建事实表,用于覆盖统计 |
| 分隔串 | 把多个值拼成一列,无法 join,除极简场景外不用 |
| 选择依据 | 是否需要把度量分摊到每个成员 |
| 统计注意 | 覆盖统计必须去重,否则同一实体被重复计数 |
典型使用场景
- 促销分析:一笔订单多张券,需要按券分摊金额
- 内容标签:一篇文章多个标签,需要统计每个标签覆盖的文章数
- 商品多类目:同一商品挂在多个类目下,需要选定主类目或按权重分摊
- 多部门协作:一个项目由多个部门参与,按投入比例分摊成本
- 多触点归因:一次转化对应多个触点,需要按模型权重分配
两种口径的写法
两种口径的写法
-- 反向事实表:以标签为主视角,统计每个标签覆盖多少订单
SELECT tag_key,
count(DISTINCT order_key) AS order_cnt -- 必须去重
FROM fact_order_tag
GROUP BY tag_key;
-- 桥接表:把订单金额按权重分摊到每个标签
SELECT b.tag_key,
sum(f.pay_amt * b.weight) AS share_amt -- 分摊口径
FROM fact_order f
JOIN bridge_order_tag b ON f.order_key = b.order_key
GROUP BY b.tag_key;
-- 同一报表里不要把分摊值与覆盖数放在一起比较,口径不同三种方式对比
| 方式 | 能否分摊 | 能否做覆盖统计 | 使用难度 |
|---|---|---|---|
| 分隔串存值 | 否 | 只能模糊匹配,结果不可靠 | 低但错误率高 |
| 桥接表 | 是,带权重 | 是,需 DISTINCT 去重 | 中 |
| 反向事实表 | 否 | 是,天然以成员视角组织 | 中,需另建一张事实表 |
先明确查询需求再选方案:要分摊就用桥接表,要统计覆盖关系就用反向事实表,两者需求都存在时通常两张都建,各自服务不同口径。
分隔串方式的问题不是不能存,而是存完无法参与维度关联:所有基于该成员的汇总只能靠字符串匹配,既无法走索引,也无法与维度表的口径变更联动。