| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- CREATE
- OR REPLACE PROCEDURE shanglifeecif.update_customer_payment_habits() -- 创建主存储过程
- IS
- BEGIN
- UPDATE shanglifeecif.customerno_insurance_policies_info a
- SET (
- pay_way_num_a,
- pay_way_date_a,
- pay_way_num_b,
- pay_way_date_b,
- pay_way_num_c,
- pay_way_date_c,
- policy_label_8
- ) = (select b.pay_way_num_a,
- b.pay_way_date_a,
- b.pay_way_num_b,
- b.pay_way_date_b,
- b.pay_way_num_c,
- b.pay_way_date_c,
- b.policy_label_8
- from (SELECT policy_no,
- max(CASE WHEN habit = '银行批扣交费' THEN num END) AS pay_way_num_a,
- max(CASE WHEN habit = '银行批扣交费' THEN lastpaydate END) AS pay_way_date_a,
- max(CASE WHEN habit = '线上交费' THEN num END) AS pay_way_num_b,
- max(CASE WHEN habit = '线上交费' THEN lastpaydate END) AS pay_way_date_b,
- max(CASE WHEN habit = '对公转账交费' THEN num END) AS pay_way_num_c,
- max(CASE WHEN habit = '对公转账交费' THEN lastpaydate END) AS pay_way_date_c,
- max(CASE WHEN row_num = 1 THEN habit END) AS policy_label_8
- FROM (SELECT habit,
- policy_no,
- num,
- lastpaydate,
- ROW_NUMBER() OVER (PARTITION BY policy_no ORDER BY num DESC,lastpaydate desc) AS row_num
- FROM ((SELECT CASE
- WHEN t.PAYMODE = '4' THEN '银行批扣交费'
- WHEN upper(t.PAYMODE) = 'F' THEN '对公转账交费'
- WHEN upper(t.PAYMODE) in ('K', 'J') THEN '线上交费'
- else '' end as habit,
- t.otherno policy_no,
- count(1) num,
- max(t.makedate) lastpaydate
- FROM dsj.ljtempfeeclass t
- WHERE t.othernotype = '2'
- AND t.paydate >= ADD_MONTHS(SYSDATE, -36)
- GROUP BY t.otherno, t.PAYMODE)))
- group by policy_no) b
- where b.policy_no = a.policy_no)
- WHERE 1 = 1;
- update shanglifeecif.Individual a
- set (Label132) = (select main_payment_period
- from (SELECT customer_no,
- period_name AS main_payment_period
- FROM (
- -- 对每个客户的三个时间段排序,取优先级最高的
- SELECT customer_no,
- period_name,
- total_num,
- latest_date,
- ROW_NUMBER() OVER (
- PARTITION BY customer_no
- ORDER BY total_num DESC, latest_date DESC
- ) AS rn -- 按次数降序、日期降序排序
- FROM (
- -- 按客户号聚合,将三个时间段转为多行
- SELECT customer_no,
- '银行批扣交费' AS period_name,
- SUM(pay_way_num_a) AS total_num,
- MAX(pay_way_date_a) AS latest_date
- FROM shanglifeecif.customerno_insurance_policies_info
- where pay_way_num_a is not null
- GROUP BY customer_no
- UNION ALL
- -- 12点-18点
- SELECT customer_no,
- '线上交费' AS period_name,
- SUM(pay_way_num_b) AS total_num,
- MAX(pay_way_date_b) AS latest_date
- FROM shanglifeecif.customerno_insurance_policies_info
- where pay_way_num_b is not null
- GROUP BY customer_no
- UNION ALL
- -- 18点以后
- SELECT customer_no,
- '对公转账交费' AS period_name,
- SUM(pay_way_num_c) AS total_num,
- MAX(pay_way_date_c) AS latest_date
- FROM shanglifeecif.customerno_insurance_policies_info
- where pay_way_num_c is not null
- GROUP BY customer_no) t1 -- t1:每个客户的三个时间段数据(一行一个时间段)
- ) t2 -- t2:对每个客户的三个时间段排序
- WHERE rn = 1) b
- where a.scustid = b.customer_no)
- where 1 = 1;
- dbms_output
- .
- put_line
- ('update_customer_payment_habits函数跑批完成!');
- EXCEPTION
- WHEN HIVE_EXCEPTION THEN
- INSERT INTO shanglifeecif.exception_log(log_id,log_code,log_msg,log_time) VALUES (to_char(sysdate(),'yyyyMMddHHmmss'),sqlcode(),sqlerrm(),sysdate());
- WHEN Others THEN
- INSERT INTO shanglifeecif.exception_log(log_id,log_code,log_msg,log_time) VALUES (to_char(sysdate(),'yyyyMMddHHmmss'),sqlcode(),sqlerrm(),sysdate());
- END;
|