首页/数据/数仓建模速查/案例:交易主题 DWS 汇总表设计
分层与规范64 条

案例:交易主题 DWS 汇总表设计

交易主题汇总表设计:维度组合选门店、商品类目、支付方式三张日表加一张月表;字段含订单数、买家数、金额与退款金额,供看板与经营分析共用。

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

案例背景与设计目标

以交易主题为例,把订单明细汇总成可复用的 DWS 表:按门店、商品类目、支付方式三个常用维度各出一张日汇总表,再加一张按类目与省份的月汇总表。设计目标是让看板与经营分析共用同一份口径中性的汇总数据,避免每个报表各自从明细算一遍。

基本信息

维度组合门店、商品类目、支付方式各一张日表
月表类目 + 省份,按自然月分区
度量订单数、买家数、支付金额、退款金额
复用方看板与经营分析共用
口径要求中性,不带应用侧过滤规则

表清单与粒度

表名粒度主要度量
dws_trade_store_day门店 + 日订单数、买家数、支付金额
dws_trade_category_day类目 + 日订单数、支付金额、退款金额
dws_trade_paytype_day支付方式 + 日订单数、支付金额
dws_trade_category_mon类目 + 省份 + 月订单数、买家数、支付与退款金额

月表滚动写入

月表滚动写入
-- 月表按自然月分区,月初重算上月并回刷三天窗口
INSERT OVERWRITE TABLE dws_trade_category_mon PARTITION (mon='2026-10')
SELECT category_id,
       province_id,
       count(DISTINCT order_id) AS order_cnt,
       count(DISTINCT buyer_id) AS buyer_cnt,
       sum(pay_amt)             AS pay_amt,
       sum(refund_amt)          AS refund_amt
FROM dwd_trade_order_di
WHERE dt BETWEEN '2026-10-01' AND '2026-10-31'
GROUP BY category_id, province_id;

关键设计取舍

  • 维度组合按查询频次选,不做「所有维度排列组合」式的表爆炸
  • 度量选口径中性的原始聚合值,比率类指标留给 ADS 重算
  • 买家数用去重计数,与订单数区分开,避免下游误用
  • 退款金额单独成列而不做抵扣,退款口径变化时不必重跑历史
  • 月表不只在月末跑,月初按回刷窗口重算,给迟到数据留出通道
月表在月初重算上月分区并保留三天回刷窗口,是让迟到数据能进入历史月份的常规做法;窗口长度按上游延迟分布确定,先统计再定,不要拍脑袋。
月表若只在月末跑一次,迟到数据永远补不进历史月份,且问题要到月度对账才暴露,届时只能整月重算。

为什么这样选维度

门店、类目、支付方式这三组维度之所以单独立表,是因为它们各自的下钻路径不同,合并成一张多维度组合表会让数据量按笛卡尔积放大,查询时又要按维度过滤,收益抵消。而类目加省份的月表承担的是经营复盘场景,维度不多但需要跨月趋势,放在月粒度比日粒度更省存储。

与上下游的衔接

  • 上游统一从 dwd_trade_order_di 取支付成功的订单,过滤条件只写一次
  • 下游 ADS 只负责加业务过滤与展示格式,不再重复做聚合
  • 指标卡上登记每张表的口径,与表注释保持一字不差
  • 新增维度组合前先统计现有表的复用率,避免重复建设

易错点

  • 月表只在月末执行一次,迟到数据无法进入已封账的月份
  • 把业务侧过滤规则(排除内部门店等)写进 DWS,其他消费方拿到被裁剪的数据
  • 维度组合无限扩张,相似度极高的多张汇总表并存,维护成本远超收益
  • 买家数用 count(1) 代替去重计数,人均指标长期偏高

数据来源与参考

  • Kimball《数据仓库工具箱(第3版)》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌