首页/数据/数仓建模速查/促销区间维度:多日活动的表达
维度与事实设计149 条

促销区间维度:多日活动的表达

促销活动跨越多个日期时,维度以活动为单位(起止日期),事实通过活动键关联;按天展开的粒度分析可用日历表桥接或事件事实。

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

促销区间维度是什么

促销活动通常跨越多天,因此促销维以「活动」为单位一行,记录起止日期,事实表通过活动键关联即可,不必按天把活动铺开成多行。需要按天粒度分析(例如活动期间每天的下单量)时,用日历表把活动区间展开成「活动 × 天」的组合,或直接使用带日期的事件事实。

基本信息

表粒度一行一个活动(含子活动)
区间字段start_date / end_date
层级parent_promo_id 表达大促与子活动关系
状态未开始 / 进行中 / 已结束 / 已取消
事实关联订单、核销事实挂 promo_sk
按天展开日历表 join 生成「活动 × 天」行

典型使用场景

  • 大促复盘:对比活动期内外的下单量与客单价变化
  • 叠加分析:同一时段多个活动并行时拆分订单归属
  • 预算控制:按活动累计花费与优惠金额,控制超支
  • 活动日历:给运营提供未来活动的排期与冲突检查
  • 效果归因:把活动期订单与自然单分列,避免虚增效果

活动维度与按天展开

活动维度与按天展开
CREATE TABLE dim_promo (
  promo_sk bigint, promo_id string, promo_name string,
  parent_promo_id string, start_date date, end_date date, promo_type string
);   -- 一行一活动,含父活动键以支持大促层级
SELECT p.promo_id, d.cal_date
FROM dim_promo p
JOIN dim_date d
  ON d.cal_date BETWEEN p.start_date AND p.end_date   -- 用日历表展开为按天:活动 × 天
WHERE p.end_date >= :start AND p.start_date <= :end;

区间展开的两种做法

做法适用场景风险
日历表展开需要活动每天明细、活动数量少活动多且区间长时行数膨胀
区间 join 事实只做活动区间内的汇总区间重叠时订单被多个活动重复计入
活动时间被修改是常态:如果历史报表已经按旧区间出过数,应保留区间版本或记录修改日志,否则同一活动两次跑批结果不一致且无法解释。
多个活动区间重叠时,订单与活动是多对多关系。正确做法是用订单-活动桥接表按业务规则分配(如最后点击、按优惠金额最大),不要靠区间 join 让订单落进每个重叠活动。

易错点

  • 活动与订单按天 join 未做去重,同一笔订单金额被重复计算多次
  • 活动时间修改后历史事实口径漂移,前后两次跑批结果对不上
  • 重叠活动没有分配规则,订单同时计入两个活动,优惠金额被放大
  • 把活动起止日期拆成每天一条维度行,活动数量一多维度表就失控

数据来源与参考

  • 数仓建模实践:促销维度
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌