首页/数据/数仓建模速查/区间型无事实表:活动覆盖展开
维度与事实设计149 条

区间型无事实表:活动覆盖展开

促销覆盖全时段时,事实表可存活动起止区间;做按天分析时用日期生成器展开为「活动 x 天」的组合。

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

区间型无事实表

区间型无事实表用一行表达「某活动在某段时间覆盖了某个范围」,事实表存的是起止日期而不是逐日铺开的行。它适合回答「某天有哪些活动在生效」这类覆盖问题。按天分析时用日期生成器(日历维)展开成「活动 × 天」的组合,展开是一次性的中间步骤,源表仍保持区间形态,避免活动一多行数就膨胀。

基本信息

表形态一行一覆盖关系,含起止日期
存储字段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 事实事实日期落在区间内区间重叠时同一事实被多次计入
按天展开后可以做「同一天多个活动」的叠加分析,但要先确认业务是否允许叠加:价格类活动常常互斥,叠加统计出的覆盖天数会虚高。
区间边界要写成半开区间或明确含首含尾,并在字典中说明;区间写法的含糊会让相邻两段活动的覆盖天数多算或少算一天。

易错点

  • 区间直接 join 订单且未限制当天,同一订单被区间内多个活动重复计入
  • 活动改期未同步到区间表,覆盖分析与实际执行不符
  • 把区间表按天提前铺开物化,活动数量与时长叠加后行数暴涨
  • 互斥活动未设冲突校验,同一天同位置出现两个互斥活动

数据来源与参考

  • 数据仓库工具箱:无事实事实表
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌