区间型无事实表
区间型无事实表用一行表达「某活动在某段时间覆盖了某个范围」,事实表存的是起止日期而不是逐日铺开的行。它适合回答「某天有哪些活动在生效」这类覆盖问题。按天分析时用日期生成器(日历维)展开成「活动 × 天」的组合,展开是一次性的中间步骤,源表仍保持区间形态,避免活动一多行数就膨胀。
基本信息
| 表形态 | 一行一覆盖关系,含起止日期 |
|---|---|
| 存储字段 | promo_sk、范围维度键、start_date、end_date |
| 展开方式 | 与日历维 join 生成组合行 |
| 主要用途 | 按天覆盖情况、活动冲突检查 |
| 数据量 | 与活动数量成正比,与天数无关 |
| 注意点 | 区间边界开闭与叠加规则需明确 |
典型使用场景
- 活动排期检查:发现同一天同一位置存在多个互斥活动
- 覆盖统计:某商品全年有促销覆盖的天数占比
- 按天归因:把活动期内每天的下单量拆出来看节奏
- 铺位管理:记录广告位在某段档期被哪个品牌占用
- 价格生效期:某价格策略在哪些日期内适用
区间展开与覆盖判断
区间展开与覆盖判断
SELECT p.promo_id, d.cal_date AS promo_date
FROM fact_promo_scope p
JOIN dim_date d
ON d.cal_date BETWEEN p.start_date AND p.end_date; -- 日期生成器展开为「活动 x 天」
SELECT d.cal_date, count(distinct p.promo_id) AS promo_cnt
FROM fact_promo_scope p
JOIN dim_date d
ON d.cal_date BETWEEN p.start_date AND p.end_date
GROUP BY d.cal_date
HAVING count(distinct p.promo_id) > 1; -- 同一天出现多个活动即为叠加,需业务确认是否允许区间表的两种用法
| 用法 | 写法 | 风险 |
|---|---|---|
| 区间存原形 | 一行一活动区间 | 不能直接按天汇总,需先展开 |
| 展开成天 | join 日历维 | 活动多、区间长时行数放大 |
| 直接 join 事实 | 事实日期落在区间内 | 区间重叠时同一事实被多次计入 |
按天展开后可以做「同一天多个活动」的叠加分析,但要先确认业务是否允许叠加:价格类活动常常互斥,叠加统计出的覆盖天数会虚高。
区间边界要写成半开区间或明确含首含尾,并在字典中说明;区间写法的含糊会让相邻两段活动的覆盖天数多算或少算一天。