# DWD 建模 > 本数仓 DWD 层(明细层)的字段建模与设计约定。建模方法论(事件 vs 状态拆分、维度建模五步、星型模型)见 `20-数仓分层与建模.md` §5;命名规则见 `21-命名规范.md` §3.4;时间语义见 `26-时间语义.md`。 > > 本文档按"业务过程一节"组织,每节包含业务过程定义 / 粒度 / dt 锚点 / 维度退化策略 / 字段表。 ## 1. 通用约定 ### 1.1 框架字段 所有 DWD 表必带 `etl_time TIMESTAMP` + 分区 `dt STRING`,`STORED AS ORC`。 ### 1.2 业务过程拆分 按 `kb/20 §5.5`:每个业务过程一张 `_apd_d` 事件表(不可变事实,只追加)。订单履约的"下单 / 支付 / 发货 / 签收"各拆一张;拼团循环动作(发起 / 审核 / 拒绝 / 重提交)按需各拆一张。 ### 1.3 维度退化策略 DWD 直引 DIM 层已清洗字段,**不在 DWD 二次清洗、不做空值兜底**。如 `cgi.sport` 脏数据归一在 `dim_trd_card_group_ful_d` 完成(见 `28-dim建模.md §3.2`),DWD pay 维度退化时直引 DIM 已清洗的 `category`。 ### 1.4 分区与写入 - 分区锚点:业务时间(事件发生日,如 `payment_success_time`),不是抽取日 - 写入策略:默认单分区 `dt=T-1`,不回算(ODS 漂移已在 ODS 层归位,DWD 不二次兜底) - 重跑幂等:`INSERT OVERWRITE` 单分区 - 调度依赖:DS DEPENDENT 同 dt ODS + 同 dt DIM ful_d 双前置(按 Kimball 维度退化原则,DWD 必依赖 DIM 同分区跑完) --- ## 2. dwd_trd_order_pay_apd_d(订单支付明细) ### 2.1 业务过程 订单支付完成。源表 `ods_trd_card_group_order_info_inc_d` 中筛选支付成功的订单。 支付成功判定: ```sql WHERE order_type = 'group' AND status IN (101, 103, 104, 105, 106, 301, 302) ``` ### 2.2 粒度 订单 id(一条 `card_group_order_info` 记录 = 一行)。 ### 2.3 dt 锚点 `DATE(payment_success_time)`,业务时间分区。同一笔订单在 ODS 层(`update_time` 锚点)和 DWD 层(业务时间锚点)的分区位置不同,是建模设计的预期。 ### 2.4 维度退化 | 字段来源 | 退化字段 | |---|---| | `dim_trd_card_group_ful_d`(拼团 → 品类)| `category` / `manufacturer` / `sets` / `year` / `list_id` / `panini_list_id` / `group_name` | | `card_group_order_info` 自有 | 其他业务字段直存 | DWD 不二次清洗 category(`dim_trd_card_group_ful_d` 已归一脏数据)。**不带大类 `main_category`**(业务侧定:拼团大类 lv1 业务库原名 `first_sport`,1 期不引,2 期再讨论)。 ### 2.5 金额字段 mer_act% 修正规则 业务库 `card_group_order_info` 部分金额字段在 `point_type LIKE 'mer_act%'` 时为分单位(积分支付场景),其他时为元单位。DWD 按下表派生统一为元单位(`_amt_cny` 后缀)。 **通式**: ```sql CASE WHEN cgoi.point_type LIKE 'mer_act%' THEN ROUND(cgoi.{业务库字段} / 100.00, 2) ELSE cgoi.{业务库字段} END AS {dwd 字段} ``` **派生映射**: | 业务库字段 | DWD 字段 | 公式 | 业务含义 | |---|---|---|---| | accounts_payable | payable_amt_cny | 通式 | **GMV** | | actual_payment / point | pay_amt_cny | 特例(见下)| **Net Revenue(购买偏好口径)**| | trade_amount | trade_amt_cny | 通式 | 订单交易金额 | | settlement_amount | settle_amt_cny | 通式 | 结算金额(支付那一刻 = 实付,_apd_d 不更新)| | card_price | card_price_cny | 通式 | 单价应付 | | act_price | act_price_cny | 通式 | 单价实付 | | discount | merchant_discount_amt_cny | 通式 | 商家折扣抵扣 | | discount_amount | discount_amount_amt_cny ❓ | 通式 | ❓ 折扣金额(业务库注释未明确,与 merchant_discount 语义区别 + 最终命名待业务答复)| | platform_discount | platform_discount_amt_cny | 通式 | 平台券抵扣 | | act_discount | act_discount_amt_cny | 通式 | 活动折扣(首单等)| | member_discount | member_discount_amt_cny | 通式 | 会员折扣 | | point_deduct | point_deduct_amt_cny | 通式 | 积分抵扣金额 | **Net Revenue 特例**(mer_act% 时换字段,不是同字段除 100): ```sql CASE WHEN cgoi.point_type LIKE 'mer_act%' THEN ROUND(cgoi.point / 100.00, 2) ELSE cgoi.actual_payment END AS pay_amt_cny ``` mer_act% 时用 `point/100`(积分支付场景:积分本质是分单位价格),其他时用 `actual_payment`。 **直取不派生**:`shipping_cost` → `shipping_amt_cny`、`shipping_free_amount` → `shipping_free_amt_cny`(业务侧未给修正逻辑,按元单位直取)。 **待业务确认**:`discount_amount` 已纳入派生(按通式),但业务库注释仅"折扣金额"未明确,与 `discount`(已命名 `merchant_discount_amt_cny`)语义区别 + 最终命名待业务答复。 DWD 内置以上派生规则,下游不再处理。 ### 2.6 字段表 | 分组 | 字段 | 类型 | 来源 | 说明 | |---|---|---|---|---| | 主键 | order_id | BIGINT | order.id | 订单 id | | 标识 | order_no | STRING | order | 订单编码 | | 标识 | combination_no | STRING | order | 拆分订单关联编号 | | 标识 | give_order_id | BIGINT | order | 赠与关联订单 id | | 用户维度 | user_id | BIGINT | order | | | 商家维度 | merchant_id | BIGINT | order | | | 拼团维度 | group_info_id | BIGINT | order | | | 拼团维度退化 | group_name | STRING | dim_trd_card_group | 拼团名称 | | 拼团维度退化 | list_id | BIGINT | dim_trd_card_group | 商家上线 checklist id(业务库快照冗余)| | 拼团维度退化 | panini_list_id | BIGINT | dim_trd_card_group | 帕尼尼 list id(业务库快照冗余)| | 拼团维度退化 | category | STRING | dim_trd_card_group | 品类(lv2,DIM 已清洗,权威源)| | 拼团维度退化 | manufacturer | STRING | dim_trd_card_group | 厂商 | | 拼团维度退化 | sets | STRING | dim_trd_card_group | 系列 | | 拼团维度退化 | year | STRING | dim_trd_card_group | 年份(赛季)| | 收货 | shipping_address_id | BIGINT | order | | | 数量 | purchase_cnt | BIGINT | order.purchase_count | 购买份数 | | 数量 | give_cnt | BIGINT | order.give_num | 赠送个数 | | 金额 | payable_amt_cny | DECIMAL(20,4) | 派生 accounts_payable(见 §2.5)| **GMV** | | 金额 | pay_amt_cny | DECIMAL(20,4) | 派生 actual_payment / point(见 §2.5)| **Net Revenue(购买偏好口径)**| | 金额 | trade_amt_cny | DECIMAL(20,4) | 派生 trade_amount | 订单交易金额 | | 金额 | settle_amt_cny | DECIMAL(20,4) | 派生 settlement_amount | 结算金额(支付那一刻=实付,_apd_d 不更新)| | 金额 | card_price_cny | DECIMAL(20,4) | 派生 card_price | 单价应付 | | 金额 | act_price_cny | DECIMAL(20,4) | 派生 act_price | 单价实付 | | 金额 | merchant_discount_amt_cny | DECIMAL(20,4) | 派生 discount | 商家折扣抵扣 | | 金额 | platform_discount_amt_cny | DECIMAL(20,4) | 派生 platform_discount | 平台券抵扣 | | 金额 | member_discount_amt_cny | DECIMAL(20,4) | 派生 member_discount | 会员折扣 | | 金额 | act_discount_amt_cny | DECIMAL(20,4) | 派生 act_discount | 活动折扣 | | 金额 | point_deduct_amt_cny | DECIMAL(20,4) | 派生 point_deduct | 积分抵扣金额 | | 金额 | shipping_amt_cny | DECIMAL(20,4) | order.shipping_cost | 运费(直取不派生)| | 金额 | shipping_free_amt_cny | DECIMAL(20,4) | order.shipping_free_amount | 运费券金额(直取不派生)| | 金额 | discount_amount_amt_cny ❓ | DECIMAL(20,4) | 派生 discount_amount(见 §2.5)| ❓ 折扣金额(业务库注释未明确,与 merchant_discount 语义区别 + 最终命名待业务答复)| | 积分 | point | BIGINT | order | 消耗积分 | | 积分 | discount_point | BIGINT | order | 折扣积分 | | 优惠券 | coupon | BIGINT | order | 优惠券 id | | 优惠券 | platform_coupon | BIGINT | order | 平台券 id | | 优惠券 | shipping_free_id | BIGINT | order | 运费券 id | | 支付 | payment_type | STRING | order | 支付方式-交易类型 | | 支付 | payment_sub_type | STRING | order | 支付子分类 | | 支付 | payment_status | STRING | order | 交易状态 | | 支付 | payment_status_desc | STRING | order | 交易状态描述 | | 支付 | payment_time | TIMESTAMP | order | 支付时间 | | 支付 | **payment_success_time** | TIMESTAMP | order | **支付完成时间(dt 锚点)**| | 支付 | pay_record | TINYINT | order | 是否重复支付 | | 业务标记 | order_type | STRING | order | 订单类型 | | 业务标记 | order_sub_type | STRING | order | 订单子类型(含赠与)| | 业务标记 | give_user_code | STRING | order | 赠与人 | | 业务标记 | anonymous | BOOLEAN | order | 是否匿名 | | 业务标记 | pick_up_type | STRING | order | 提货方式 | | 业务标记 | point_type | STRING | order | 使用积分类型 | | 业务标记 | open_self | TINYINT | order | 是否商家代拆(默认 0,1=商家待拆)| | 时间 | order_create_time | TIMESTAMP | order.create_time | 下单时间 | | 时间 | expire_time | TIMESTAMP | order | 过期时间 | | 软删 | is_deleted | BOOLEAN | order | 软删归一 | | 框架 | etl_time | TIMESTAMP | 派生 | ETL 处理时间 | | 分区 | dt | STRING | `DATE(payment_success_time)` | **业务时间分区**| > **未纳入字段**(按事件不可变设计,归 `dim_trd_order_zip_d` 拉链或后续业务事件表):`status` / `serve_status` / `update_time` / `refuse_status` / `waring_type` / `waring_status` / `goods_allocate` / `invoice_id`。