dwd_trd_order_pay_apd_d.sql 8.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. -- 作者:tianyu.chu
  2. -- 日期:2026-05-10(2026-06-03 日调度+补数合一为统一参数化)
  3. -- 工单:(无)
  4. -- 目的:dwd_trd_order_pay_apd_d 统一计算 SQL(kb/93 ADR-09/ADR-11 宽扫窄落):
  5. -- 日调度 + 手动补数共用本文件,传参区分职能(两个独立 DS workflow):
  6. -- 日调度(滚动 N=30): -p start_date=$[yyyyMMdd-30] -p stop_date=${cdt}(挂 schedule 自动跑)
  7. -- 手动补数: -p start_date=<起始> -p stop_date=${cdt}(不挂 schedule,运维兜底)
  8. -- ods.dt 宽扫 [${start_date}-1, 不限](捞回 update_time 漂移到后续 ods 分区的版本);
  9. -- payment 业务时间窄落 [${start_date}, ${stop_date}) 左闭右开;
  10. -- status 在 ROW_NUMBER 外层判最新版本(避免捞回已退款单的退款前版本,见 ADR-09/12);
  11. -- LEFT JOIN dim_trd.dt=${stop_date}-1(最新全量快照退化 category 等)
  12. -- 状态:[草案]
  13. -- 备注:${stop_date}=${cdt}(today,左闭右开覆盖到 today-1,当天不落交次日);
  14. -- 回算窗 N=30 依据退款窗实测(P95=15/MAX=20,ADR-09);跨多 dt 动态分区 SET 上限 2000;
  15. -- 前置:ods 补到 today-1 + dim_trd 补到 today-1(否则 category 全 NULL);
  16. -- dwd 历史可变可接受(ods 真源,dwd 可从 ods 回放重建,ADR-09);
  17. -- 上界不限 = 扫到 ods 最新分区,payment ∈ [${start_date}, ${stop_date}) 的订单 ods 版本落点必 ≤ 最新,全部捞到
  18. set hive.exec.max.dynamic.partitions=2000;
  19. set hive.exec.max.dynamic.partitions.pernode=200;
  20. INSERT OVERWRITE TABLE dwd.dwd_trd_order_pay_apd_d PARTITION (dt)
  21. SELECT
  22. o.id AS order_id,
  23. o.order_no AS order_no,
  24. o.combination_no AS combination_no,
  25. o.give_order_id AS give_order_id,
  26. o.user_id AS user_id,
  27. o.merchant_id AS merchant_id,
  28. o.group_info_id AS group_info_id,
  29. cg.name AS group_name,
  30. cg.list_id AS list_id,
  31. cg.panini_list_id AS panini_list_id,
  32. cg.category AS category,
  33. cg.manufacturer AS manufacturer,
  34. cg.sets AS sets,
  35. cg.year AS year,
  36. o.shipping_address_id AS shipping_address_id,
  37. o.purchase_count AS purchase_cnt,
  38. o.give_num AS give_cnt,
  39. 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,
  40. CASE WHEN o.point_type LIKE 'mer_act%' THEN ROUND(o.point / 100.00, 2) ELSE o.actual_payment END AS pay_amt_cny,
  41. 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,
  42. 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,
  43. 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,
  44. 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,
  45. CASE WHEN o.point_type LIKE 'mer_act%' THEN ROUND(o.discount / 100.00, 2) ELSE o.discount END AS merchant_discount_amt_cny,
  46. 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,
  47. 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,
  48. 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,
  49. 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,
  50. o.shipping_cost AS shipping_amt_cny,
  51. o.shipping_free_amount AS shipping_free_amt_cny,
  52. 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,
  53. o.point AS point,
  54. o.discount_point AS discount_point,
  55. o.coupon AS coupon,
  56. o.platform_coupon AS platform_coupon,
  57. o.shipping_free_id AS shipping_free_id,
  58. o.payment_type AS payment_type,
  59. o.payment_sub_type AS payment_sub_type,
  60. o.payment_status AS payment_status,
  61. o.payment_status_desc AS payment_status_desc,
  62. o.payment_time AS payment_time,
  63. o.payment_success_time AS payment_success_time,
  64. o.pay_record AS pay_record,
  65. o.order_type AS order_type,
  66. o.order_sub_type AS order_sub_type,
  67. o.give_user_code AS give_user_code,
  68. o.anonymous AS anonymous,
  69. o.pick_up_type AS pick_up_type,
  70. o.point_type AS point_type,
  71. o.open_self AS open_self,
  72. o.create_time AS order_create_time,
  73. o.expire_time AS expire_time,
  74. o.is_deleted AS is_deleted,
  75. CURRENT_TIMESTAMP() AS etl_time,
  76. DATE_FORMAT(o.payment_success_time, 'yyyyMMdd') AS dt
  77. FROM (
  78. SELECT *
  79. FROM (
  80. SELECT *,
  81. ROW_NUMBER() OVER (
  82. PARTITION BY id
  83. ORDER BY COALESCE(update_time, create_time) DESC
  84. ) AS rn
  85. FROM ods.ods_trd_card_group_order_info_inc_d
  86. WHERE dt >= DATE_FORMAT(DATE_SUB(FROM_UNIXTIME(UNIX_TIMESTAMP('${start_date}', 'yyyyMMdd')), 1), 'yyyyMMdd')
  87. AND payment_success_time IS NOT NULL
  88. AND DATE_FORMAT(payment_success_time, 'yyyyMMdd') >= '${start_date}'
  89. AND DATE_FORMAT(payment_success_time, 'yyyyMMdd') < '${stop_date}'
  90. ) t
  91. WHERE t.rn = 1
  92. AND t.status IN (101, 103, 104, 105, 106, 301, 302)
  93. ) o
  94. LEFT JOIN dim.dim_trd_card_group_ful_d cg
  95. ON o.group_info_id = cg.group_info_id
  96. AND cg.dt = DATE_FORMAT(DATE_SUB(FROM_UNIXTIME(UNIX_TIMESTAMP('${stop_date}', 'yyyyMMdd')), 1), 'yyyyMMdd');