dim_usr_user_ful_d.sql 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. -- 作者:tianyu.chu
  2. -- 日期:2026-05-09
  3. -- 工单:(无)
  4. -- 目的:dim_usr_user_ful_d 日常增量(kb/28 §1.3):
  5. -- new = 今日 ods (base / cert) 增量;old = dim.dt=${pdt} 昨日全量;
  6. -- old FULL OUTER JOIN today_base FULL OUTER JOIN today_cert,字段 COALESCE(today, old) 优先取今日
  7. -- 状态:[草案]
  8. -- 备注:sched=T,${dt}=T-1,${pdt}=T-2;
  9. -- ods 增量同步只含当天有 update 的 user,所以今日 ods 即"今日变更行";
  10. -- base 字段从 today_base 取(今日没变就 NULL→fallback old);cert 字段从 today_cert 取同理;
  11. -- cert_info update_time 几乎全空,ORDER BY 用 COALESCE(update_time, create_time);
  12. -- 前置 DS DEPENDENT:ods.base_user.dt=${dt} + ods.cert_info.dt=${dt} + dim.dt=${pdt}
  13. INSERT OVERWRITE TABLE dim.dim_usr_user_ful_d PARTITION (dt='${dt}')
  14. WITH today_base AS (
  15. SELECT *
  16. FROM (
  17. SELECT *,
  18. ROW_NUMBER() OVER (
  19. PARTITION BY id
  20. ORDER BY COALESCE(update_time, create_time) DESC
  21. ) AS rn
  22. FROM ods.ods_usr_app_base_user_inc_d
  23. WHERE dt = '${dt}'
  24. ) t
  25. WHERE t.rn = 1
  26. ),
  27. today_cert AS (
  28. SELECT *
  29. FROM (
  30. SELECT *,
  31. ROW_NUMBER() OVER (
  32. PARTITION BY user_id
  33. ORDER BY COALESCE(update_time, create_time) DESC
  34. ) AS rn
  35. FROM ods.ods_usr_app_user_cert_info_inc_d
  36. WHERE dt = '${dt}'
  37. ) t
  38. WHERE t.rn = 1
  39. ),
  40. old_dim AS (
  41. SELECT * FROM dim.dim_usr_user_ful_d WHERE dt = '${pdt}'
  42. )
  43. SELECT
  44. COALESCE(bu.id, ci.user_id, o.user_id) AS user_id,
  45. COALESCE(bu.appid, o.appid) AS appid,
  46. COALESCE(bu.username, o.username) AS username,
  47. COALESCE(bu.code, o.code) AS code,
  48. COALESCE(ci.cert_sex, o.sex_cert) AS sex_cert,
  49. COALESCE(ci.cert_birthday, o.birthday_cert) AS birthday_cert,
  50. COALESCE(ci.cert_province, o.cert_province) AS cert_province,
  51. COALESCE(ci.cert_city, o.cert_city) AS cert_city,
  52. CASE WHEN ci.user_id IS NOT NULL OR o.is_cert = TRUE THEN TRUE ELSE FALSE END AS is_cert,
  53. COALESCE(bu.id_card, o.id_card) AS id_card,
  54. COALESCE(bu.face_verify, o.face_verify) AS face_verify,
  55. COALESCE(bu.cancel_verify_num, o.cancel_verify_num) AS cancel_verify_num,
  56. COALESCE(bu.register_channel, o.register_channel) AS register_channel,
  57. COALESCE(bu.register_addr, o.register_addr) AS register_addr,
  58. COALESCE(bu.register_ip_addr, o.register_ip_addr) AS register_ip_addr,
  59. COALESCE(bu.create_time, o.reg_create_time) AS reg_create_time,
  60. COALESCE(bu.login_addr, o.login_addr) AS login_addr,
  61. COALESCE(bu.login_ip_addr, o.login_ip_addr) AS login_ip_addr,
  62. COALESCE(bu.level, o.level) AS level,
  63. COALESCE(bu.member_level, o.member_level) AS member_level,
  64. COALESCE(bu.member_name, o.member_name) AS member_name,
  65. COALESCE(bu.growth_num, o.growth_num) AS growth_num,
  66. COALESCE(bu.current_month_growth, o.current_month_growth) AS current_month_growth,
  67. COALESCE(bu.member_keep_growth, o.member_keep_growth) AS member_keep_growth,
  68. COALESCE(bu.member_init_flag, o.member_init_flag) AS member_init_flag,
  69. COALESCE(bu.point, o.point) AS point,
  70. COALESCE(bu.consume_amount, o.consume_amount_cny) AS consume_amount_cny,
  71. COALESCE(bu.order_total_num, o.order_total_num) AS order_total_num,
  72. COALESCE(bu.status, o.status) AS status,
  73. COALESCE(bu.blacklist, o.blacklist) AS blacklist,
  74. COALESCE(bu.refuse_pick_up, o.refuse_pick_up) AS refuse_pick_up,
  75. COALESCE(bu.notify_flag, o.notify_flag) AS notify_flag,
  76. COALESCE(bu.open_invoice, o.open_invoice) AS open_invoice,
  77. COALESCE(bu.open_psd, o.open_psd) AS open_psd,
  78. COALESCE(bu.daily_limit, o.daily_limit) AS daily_limit,
  79. COALESCE(bu.weekly_limit, o.weekly_limit) AS weekly_limit,
  80. COALESCE(bu.monthly_limit, o.monthly_limit) AS monthly_limit,
  81. COALESCE(bu.update_time, o.last_update_time) AS last_update_time,
  82. COALESCE(bu.is_deleted, o.is_deleted) AS is_deleted,
  83. CURRENT_TIMESTAMP() AS etl_time
  84. FROM old_dim o
  85. FULL OUTER JOIN today_base bu ON o.user_id = bu.id
  86. FULL OUTER JOIN today_cert ci ON COALESCE(o.user_id, bu.id) = ci.user_id;