客户接听习惯-Proc.sql 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. CREATE
  2. OR REPLACE PROCEDURE shanglifeecif.update_customer_response_habits() -- 创建主存储过程
  3. IS
  4. BEGIN
  5. UPDATE shanglifeecif.customerno_insurance_policies_info a
  6. SET (
  7. phone_answering_time_num_a,
  8. phone_answering_time_date_a,
  9. phone_answering_time_num_b,
  10. phone_answering_time_date_b,
  11. phone_answering_time_num_c,
  12. phone_answering_time_date_c,
  13. policy_label_7
  14. ) = (select b.phone_answering_time_num_a,
  15. b.phone_answering_time_date_a,
  16. b.phone_answering_time_num_b,
  17. b.phone_answering_time_date_b,
  18. b.phone_answering_time_num_c,
  19. b.phone_answering_time_date_c,
  20. b.policy_label_7
  21. from (SELECT productno,
  22. max(CASE WHEN timeslot = '习惯12点前接听电话' THEN talknum END) AS phone_answering_time_num_a,
  23. max(CASE WHEN timeslot = '习惯12点前接听电话' THEN maxTalkStartTime END) AS phone_answering_time_date_a,
  24. max(CASE WHEN timeslot = '习惯12点-18点接听电话' THEN talknum END) AS phone_answering_time_num_b,
  25. max(CASE WHEN timeslot = '习惯12点-18点接听电话' THEN maxTalkStartTime END) AS phone_answering_time_date_b,
  26. max(CASE WHEN timeslot = '习惯18点以后接听电话' THEN talknum END) AS phone_answering_time_num_c,
  27. max(CASE WHEN timeslot = '习惯18点以后接听电话' THEN maxTalkStartTime END) AS phone_answering_time_date_c,
  28. max(CASE WHEN row_num = 1 THEN timeslot END) AS policy_label_7
  29. FROM (SELECT productno,
  30. timeSlot,
  31. talkNum,
  32. maxTalkStartTime,
  33. ROW_NUMBER() OVER (PARTITION BY productno ORDER BY talkNum DESC, maxTalkStartTime DESC) AS row_num
  34. FROM ((SELECT actionData.productno,
  35. CASE WHEN HOUR (actionLog.talkStart) < 12 THEN '习惯12点前接听电话'
  36. WHEN 12 <= HOUR (actionLog.talkStart) < 18 THEN '习惯12点-18点接听电话'
  37. WHEN HOUR (actionLog.talkStart) >= 18 THEN '习惯18点以后接听电话'
  38. ELSE 'other' END AS timeSlot,
  39. count (1) AS talkNum ,
  40. max (actionLog.talkStart) AS maxTalkStartTime
  41. FROM dsj.cc_action_data actionData
  42. LEFT JOIN dsj.cc_action_actionlog actionLog
  43. ON actionData.dataguid = actionLog.dataguid
  44. WHERE DATE_FORMAT(actionData.inserttime
  45. , 'yyyy-MM-dd HH:mm:ss.S') >= ADD_MONTHS(SYSDATE
  46. , -12)
  47. AND actionLog.usercode NOT LIKE '%admin%'
  48. AND actionlog.resultid = '0203000000'
  49. AND actionData.actiondefguid IN ('402837815c2ff6b5015c3005e7fb0001'
  50. , '402837815c2ff6b5015c3005e7fb0002'
  51. , '402837815c2ff6b5015c3005e7fb0003'
  52. , '402837815c2ff6b5015c3005e7fb0005')
  53. GROUP BY productno, timeSlot)))
  54. GROUP BY productno) b
  55. where b.productno = a.policy_no)
  56. WHERE 1 = 1;
  57. ---更新用户表标签数据
  58. update shanglifeecif.Individual a
  59. set (Label131) = (select main_answering_period
  60. from (SELECT customer_no,
  61. period_name AS main_answering_period
  62. FROM (
  63. -- 对每个客户的三个时间段排序,取优先级最高的
  64. SELECT customer_no,
  65. period_name,
  66. total_num,
  67. latest_date,
  68. ROW_NUMBER() OVER (
  69. PARTITION BY customer_no
  70. ORDER BY total_num DESC, latest_date DESC
  71. ) AS rn -- 按次数降序、日期降序排序
  72. FROM (
  73. -- 按客户号聚合,将三个时间段转为多行
  74. SELECT customer_no,
  75. -- 12点前
  76. '习惯12点前接听电话' AS period_name,
  77. SUM(phone_answering_time_num_a) AS total_num,
  78. MAX(phone_answering_time_date_a) AS latest_date
  79. FROM shanglifeecif.customerno_insurance_policies_info
  80. where phone_answering_time_num_a is not null
  81. GROUP BY customer_no
  82. UNION ALL
  83. -- 12点-18点
  84. SELECT customer_no,
  85. '习惯12点-18点接听电话' AS period_name,
  86. SUM(phone_answering_time_num_b) AS total_num,
  87. MAX(phone_answering_time_date_b) AS latest_date
  88. FROM shanglifeecif.customerno_insurance_policies_info
  89. where phone_answering_time_num_b is not null
  90. GROUP BY customer_no
  91. UNION ALL
  92. -- 18点以后
  93. SELECT customer_no,
  94. '习惯18点以后接听电话' AS period_name,
  95. SUM(phone_answering_time_num_c) AS total_num,
  96. MAX(phone_answering_time_date_c) AS latest_date
  97. FROM shanglifeecif.customerno_insurance_policies_info
  98. where phone_answering_time_num_c is not null
  99. GROUP BY customer_no) t1 -- t1:每个客户的三个时间段数据(一行一个时间段)
  100. ) t2 -- t2:对每个客户的三个时间段排序
  101. WHERE rn = 1) b
  102. where a.scustid = b.customer_no)
  103. where 1 = 1 ;
  104. dbms_output
  105. .
  106. put_line
  107. ('update_customer_response_habits函数跑批完成!');
  108. EXCEPTION
  109. WHEN HIVE_EXCEPTION THEN
  110. INSERT INTO shanglifeecif.exception_log(log_id,log_code,log_msg,log_time) VALUES (to_char(sysdate(),'yyyyMMddHHmmss'),sqlcode(),sqlerrm(),sysdate());
  111. WHEN Others THEN
  112. INSERT INTO shanglifeecif.exception_log(log_id,log_code,log_msg,log_time) VALUES (to_char(sysdate(),'yyyyMMddHHmmss'),sqlcode(),sqlerrm(),sysdate());
  113. END;