无事实事实表是什么
无事实事实表(factless fact table)是不存放数值度量的事实表,只有一组维度外键,用来记录“发生过”或“满足条件”的关系:谁参加了哪场活动、谁看过哪篇内容、哪些实体命中哪些规则。统计时对行数或去重主体计数即可,因此它天然适合覆盖率、参与度与圈选命中分析。它的粒度声明尤其重要:一行代表一次参与关系还是一人一次,决定了后面能不能直接 COUNT。
基本信息
| 结构 | 只含维度外键,不含度量列 |
|---|---|
| 用途 | 计数、覆盖、参与关系、命中分析 |
| 变体 | 条件覆盖表:一行一种条件与实体的组合 |
| 计数要点 | 按业务主体去重,避免一人多次被重复计数 |
| 实现位置 | 通常在 DWD 或 DWS 层沉淀 |
典型使用场景
- 活动参与:记录用户参加了哪场活动,用于计算参与率与覆盖人数
- 内容浏览:记录用户看过哪些内容,支撑覆盖率与触达分析
- 规则命中:记录每个用户命中哪些标签或圈选条件,用于投放效果评估
- 商品与类目可见性:某商品被哪些门店上架,用于铺货覆盖分析
- 权限与授权关系:谁被授予了哪些数据表权限,用于合规核查
活动参与记录
活动参与记录
-- 一行代表一次参与关系
CREATE TABLE fact_event_attend (
event_sk INT, user_sk BIGINT, date_sk INT
) PARTITIONED BY (dt STRING);
-- 参与人次(按行计数)
SELECT COUNT(1) FROM fact_event_attend WHERE event_sk = 1001 AND dt = '2026-10-11';
-- 参与人数(按主体去重)
SELECT COUNT(DISTINCT user_sk) FROM fact_event_attend
WHERE event_sk = 1001 AND dt = '2026-10-11';
-- 条件覆盖表:一行一种条件与实体
-- SELECT condition_id, COUNT(DISTINCT user_sk) FROM fact_user_condition_hit GROUP BY condition_id;两类无事实表对照
| 类型 | 行表示什么 | 典型指标 | 注意点 |
|---|---|---|---|
| 事件参与型 | 一次参与关系 | 参与人次、参与人数 | 区分人次与人数 |
| 条件覆盖型 | 一个实体命中的一种条件 | 命中人数、覆盖率 | 条件变化需重算历史 |
| 可见性型 | 一个实体与渠道的组合 | 铺货率、可见商品数 | 注意与主数据同步 |
无事实事实表也可以承载条件覆盖语义:如每个用户每天满足哪些标签条件,用于圈选与命中分析,比在宽表里堆布尔列更容易扩展。
直接 COUNT(*) 统计人数时,同一用户多次参与会被重复计数;先明确一行代表什么,再决定是用 COUNT 还是 COUNT DISTINCT。
无事实表同样要好维护:条件集合变化后历史覆盖结果无法自动回溯,需要在口径文档里写明重算方式与生效日期。