促销区间维度是什么
促销活动通常跨越多天,因此促销维以「活动」为单位一行,记录起止日期,事实表通过活动键关联即可,不必按天把活动铺开成多行。需要按天粒度分析(例如活动期间每天的下单量)时,用日历表把活动区间展开成「活动 × 天」的组合,或直接使用带日期的事件事实。
基本信息
| 表粒度 | 一行一个活动(含子活动) |
|---|---|
| 区间字段 | 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 让订单落进每个重叠活动。