dwd_trd_order_pay_apd_d.sql 7.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. -- 作者:tianyu.chu
  2. -- 日期:2026-05-10
  3. -- 工单:(无)
  4. -- 目的:dwd_trd_order_pay_apd_d 日常增量(kb/27 §1.4 + §2):
  5. -- 回算近 2 日(kb/20 §7.3 通用兜底,业界主流 N=2):扫 ods.dt IN (${dt}, ${pdt}) +
  6. -- 过滤业务时间 DATE(payment_success_time) IN (${dt}, ${pdt}) + 状态码筛选支付成功 +
  7. -- ROW_NUMBER 取每 order_id 最新版本 +
  8. -- LEFT JOIN dim_trd_card_group_ful_d.dt=${dt} 维度退化 +
  9. -- 11 字段金额 mer_act% 派生(kb/27 §2.5)+ 动态分区写入 dwd dt IN (${dt}, ${pdt})
  10. -- 状态:[草案]
  11. -- 备注:sched=T,${dt}=T-1,${pdt}=T-2;
  12. -- 回算 N=2 兜底跨零点漂移:业务时间 T-1 但 update_time 漂到 T 的事件,在 T+1 跑批时通过扫 ods.dt=T 兜回;
  13. -- INSERT OVERWRITE 动态分区(kb/26 §8 项目默认 DYNAMIC mode):只覆盖 SELECT 出现的 dt 分区,不动其他历史分区;
  14. -- dwd_pay 是数仓支付明细,不限定 order_type(所有订单类型都进);
  15. -- 前置 DS DEPENDENT:ods.${dt} + dim.${dt}(${pdt} 历史分区已就绪)
  16. INSERT OVERWRITE TABLE dwd.dwd_trd_order_pay_apd_d PARTITION (dt)
  17. SELECT
  18. o.id AS order_id,
  19. o.order_no AS order_no,
  20. o.combination_no AS combination_no,
  21. o.give_order_id AS give_order_id,
  22. o.user_id AS user_id,
  23. o.merchant_id AS merchant_id,
  24. o.group_info_id AS group_info_id,
  25. cg.name AS group_name,
  26. cg.list_id AS list_id,
  27. cg.panini_list_id AS panini_list_id,
  28. cg.category AS category,
  29. cg.manufacturer AS manufacturer,
  30. cg.sets AS sets,
  31. cg.year AS year,
  32. o.shipping_address_id AS shipping_address_id,
  33. o.purchase_count AS purchase_cnt,
  34. o.give_num AS give_cnt,
  35. CASE WHEN o.point_type LIKE 'mer_act%' THEN ROUND(o.accounts_payable / 100.00, 2) ELSE o.accounts_payable END AS payable_amt_cny,
  36. CASE WHEN o.point_type LIKE 'mer_act%' THEN ROUND(o.point / 100.00, 2) ELSE o.actual_payment END AS pay_amt_cny,
  37. CASE WHEN o.point_type LIKE 'mer_act%' THEN ROUND(o.trade_amount / 100.00, 2) ELSE o.trade_amount END AS trade_amt_cny,
  38. CASE WHEN o.point_type LIKE 'mer_act%' THEN ROUND(o.settlement_amount / 100.00, 2) ELSE o.settlement_amount END AS settle_amt_cny,
  39. CASE WHEN o.point_type LIKE 'mer_act%' THEN ROUND(o.card_price / 100.00, 2) ELSE o.card_price END AS card_price_cny,
  40. CASE WHEN o.point_type LIKE 'mer_act%' THEN ROUND(o.act_price / 100.00, 2) ELSE o.act_price END AS act_price_cny,
  41. CASE WHEN o.point_type LIKE 'mer_act%' THEN ROUND(o.discount / 100.00, 2) ELSE o.discount END AS merchant_discount_amt_cny,
  42. CASE WHEN o.point_type LIKE 'mer_act%' THEN ROUND(o.platform_discount / 100.00, 2) ELSE o.platform_discount END AS platform_discount_amt_cny,
  43. CASE WHEN o.point_type LIKE 'mer_act%' THEN ROUND(o.member_discount / 100.00, 2) ELSE o.member_discount END AS member_discount_amt_cny,
  44. CASE WHEN o.point_type LIKE 'mer_act%' THEN ROUND(o.act_discount / 100.00, 2) ELSE o.act_discount END AS act_discount_amt_cny,
  45. CASE WHEN o.point_type LIKE 'mer_act%' THEN ROUND(o.point_deduct / 100.00, 2) ELSE o.point_deduct END AS point_deduct_amt_cny,
  46. o.shipping_cost AS shipping_amt_cny,
  47. o.shipping_free_amount AS shipping_free_amt_cny,
  48. CASE WHEN o.point_type LIKE 'mer_act%' THEN ROUND(o.discount_amount / 100.00, 2) ELSE o.discount_amount END AS discount_amount_amt_cny,
  49. o.point AS point,
  50. o.discount_point AS discount_point,
  51. o.coupon AS coupon,
  52. o.platform_coupon AS platform_coupon,
  53. o.shipping_free_id AS shipping_free_id,
  54. o.payment_type AS payment_type,
  55. o.payment_sub_type AS payment_sub_type,
  56. o.payment_status AS payment_status,
  57. o.payment_status_desc AS payment_status_desc,
  58. o.payment_time AS payment_time,
  59. o.payment_success_time AS payment_success_time,
  60. o.pay_record AS pay_record,
  61. o.order_type AS order_type,
  62. o.order_sub_type AS order_sub_type,
  63. o.give_user_code AS give_user_code,
  64. o.anonymous AS anonymous,
  65. o.pick_up_type AS pick_up_type,
  66. o.point_type AS point_type,
  67. o.open_self AS open_self,
  68. o.create_time AS order_create_time,
  69. o.expire_time AS expire_time,
  70. o.is_deleted AS is_deleted,
  71. CURRENT_TIMESTAMP() AS etl_time,
  72. DATE_FORMAT(o.payment_success_time, 'yyyyMMdd') AS dt
  73. FROM (
  74. SELECT *
  75. FROM (
  76. SELECT *,
  77. ROW_NUMBER() OVER (
  78. PARTITION BY id
  79. ORDER BY COALESCE(update_time, create_time) DESC
  80. ) AS rn
  81. FROM ods.ods_trd_card_group_order_info_inc_d
  82. WHERE dt IN ('${dt}', '${pdt}')
  83. AND status IN (101, 103, 104, 105, 106, 301, 302)
  84. AND payment_success_time IS NOT NULL
  85. AND DATE_FORMAT(payment_success_time, 'yyyyMMdd') IN ('${dt}', '${pdt}')
  86. ) t
  87. WHERE t.rn = 1
  88. ) o
  89. LEFT JOIN dim.dim_trd_card_group_ful_d cg
  90. ON o.group_info_id = cg.group_info_id
  91. AND cg.dt = '${dt}';