Procházet zdrojové kódy

fix(trd): 拼团 raw 锚点改 OR + ods 塌成活动日 GREATEST 单口径

镜像订单:raw where COALESCE→create OR update;ods 过滤/去重/分桶改 GREATEST(create,update)
活动日、按 ${dt} 分桶(业务会改 create、无创建日概念)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
tianyu.chu před 1 týdnem
rodič
revize
e54674493f

+ 7 - 6
jobs/ods/trd/ods_trd_card_group_info_inc_d.sql

@@ -1,9 +1,10 @@
 -- 作者:tianyu.chu
 -- 日期:2026-05-07
 -- 工单:(无)
--- 目的:raw → ods 增量同步(ADR-03);双源 union (raw dt=${dt} + raw dt=${pdt}) + DATE_FORMAT(COALESCE(update_time, create_time))=${dt} 过滤 + (id, ods_dt) dedupe + 动态分区写入
+-- 目的:raw → ods 增量同步(ADR-03);双源 union (raw dt=${dt} + raw dt=${pdt}) + 活动日 = ${dt} 过滤 + 按运行日 ${dt} 分桶(dt=活动日 GREATEST(create,update))+ (id) dedupe + 动态分区写入
 -- 状态:[草案]
--- 备注:sched=T,${dt}=业务日 T-1(yyyyMMdd),${pdt}=T-2;ods 跨 dt 不去重,同 pk 多 dt 并存(拉链表底层)
+-- 备注:sched=T,${dt}=业务日 T-1(yyyyMMdd),${pdt}=T-2;ods 跨 dt 不去重,同 pk 多 dt 并存(拉链表底层);
+--       dt=活动日 = GREATEST(create, update):业务会改 create、二者皆活动性时间戳、无"创建日"概念,取较晚者为最后活动日;每单每活动日一份
 
 INSERT OVERWRITE TABLE ods.ods_trd_card_group_info_inc_d PARTITION (dt)
 SELECT
@@ -126,13 +127,13 @@ SELECT
     ods_dt                                              AS dt
 FROM (
     SELECT *,
-        DATE_FORMAT(COALESCE(NULLIF(update_time, ''), create_time), 'yyyyMMdd') AS ods_dt,
+        '${dt}' AS ods_dt,
         ROW_NUMBER() OVER (
-            PARTITION BY id, DATE_FORMAT(COALESCE(NULLIF(update_time, ''), create_time), 'yyyyMMdd')
-            ORDER BY COALESCE(NULLIF(update_time, ''), create_time) DESC
+            PARTITION BY id
+            ORDER BY GREATEST(create_time, NULLIF(update_time, '')) DESC
         ) AS rn
     FROM raw.raw_trd_card_group_info_inc_d
     WHERE dt IN ('${dt}', '${pdt}')
-      AND DATE_FORMAT(COALESCE(NULLIF(update_time, ''), create_time), 'yyyyMMdd') = '${dt}'
+      AND DATE_FORMAT(GREATEST(create_time, NULLIF(update_time, '')), 'yyyyMMdd') = '${dt}'
 ) t
 WHERE t.rn = 1;

+ 2 - 2
jobs/raw/trd/raw_trd_card_group_info_inc_d.ini

@@ -2,7 +2,7 @@
 ; 日期:2026-04-30
 ; 工单:(无)
 ; 目的:PG public.card_group_info -> Hive raw.raw_trd_card_group_info_inc_d
-;       拼团信息表(card_group_info),日常增量同步,时间锚点 = update_time
+;       拼团信息表(card_group_info),日常增量同步,时间锚点 = create OR update(双命中,防 update<create 漏单)
 ;
 ; 配套 DDL:manual/ddl/raw/trd/raw_trd_card_group_info_inc_d_create.sql
 ; 配套 mask 配置:jobs/raw/trd/raw_trd_card_group_info_inc_d.mask.ini
@@ -14,7 +14,7 @@ database = hobby_stocks
 table = public.card_group_info
 column = id,merchant_id,appid,name,code,status,specs,type,random_type,total_price,copies,unit_price,sold_copies,release_time,cycle,show_applet,title,msg,remark,create_time,update_by,update_time,order_quota_min,order_quota_max,user_quota_max,start_time,marketing_info,reviewmsg,lock,commission_rate,year,sport,manufacturer,sets,act,config,info_config,total_num,banner_end_time,add_banner,finished_time,display_name,group_sets_no,close_payment_time,confirm_send_time,close_payment_status,open_card,close_payment_record,group_full_time,live_create_time,live_start_time,live_end_time,report_start_time,report_end_time,report_review_num,report_review_first_time,report_review_end_time,review_hold_time,review_approval_time,review_num,config_json,free_flag,mer_name,change_type,act_price,act_config_json,real_sold_num,weight,hot_type,team_first,prop1,prop2,prop3,point_rate,point_max,point_min,list_id,list_code,mix_copies,sub_type,act_point_type,payment_method,payment_total_price,payment_commission,payment_finished_price,payment_remain_price,payment_online_price,exclusive,has_bg,merchant_sort,del_flg,del_time,review_account,act_id,sold_end_time,panini_list_id,hot_type_config,goods_type,report_flag,use_coupon,user_level,custom,gift_card_id,group_show_name,min_card_num,act_type,waring_type,compensation_status,point_type,first_act_config,gift_config,version,extra_prop,use_member_discount,merchant_open
 columnType =
-where = COALESCE(update_time, create_time) >= '${start_date}' AND COALESCE(update_time, create_time) < '${stop_date}'
+where = (create_time >= '${start_date}' AND create_time < '${stop_date}') OR (update_time >= '${start_date}' AND update_time < '${stop_date}')
 querySql =
 splitPk = id
 fetchSize = 1000