识别并合并因segment_value_cd空值导致的错误历史记录
筛选并处理party_segment中空值/空格导致的错误历史记录
根据你的描述,你需要精准筛选出party_segment表中因segment_value_cd为空或含空格、且segment_type_cd未变更的错误历史记录,后续还要合并这类成对记录。我来给你一步步拆解解决方案:
第一步:精准筛选符合条件的错误记录
原查询返回了所有指定party_id的记录,我们需要缩小范围,只保留满足以下条件的记录:
- 对应
party_id的segment_type_cd从未变更(排除正常的类型变更历史) - 该组记录中存在
segment_value_cd为空或仅含空格的情况
可以用CTE先锁定有问题的party_id+segment_type_cd组合,再关联取出对应记录:
WITH problematic_groups AS ( -- 找出存在空/空格segment_value_cd的party_id+类型组合,且该组合下类型唯一 SELECT party_id, Segment_Type_Cd FROM party_segment WHERE TRIM(Segment_Value_Cd) = '' -- 匹配空值、空字符串、纯空格 GROUP BY party_id, Segment_Type_Cd HAVING COUNT(DISTINCT Segment_Type_Cd) = 1 ) -- 取出这些问题组合下的所有记录 SELECT ps.* FROM party_segment ps JOIN problematic_groups pg ON ps.party_id = pg.party_id AND ps.Segment_Type_Cd = pg.Segment_Type_Cd WHERE ps.party_id IN (6303031, 6824664, 216502393, 6916270)
关键逻辑说明:
TRIM(Segment_Value_Cd) = '':比直接判断IS NULL或= ''更全面,能覆盖字段值为多个空格的情况HAVING COUNT(DISTINCT Segment_Type_Cd) = 1:确保该party_id下的这个类型没有变更,排除你提到的像party_id=23707这类正常历史记录
第二步:合并成对的错误记录
如果要把示例中前后衔接的成对记录(比如空值记录和后续的?记录)合并成一条,可以用窗口函数标记前后记录,再分组聚合:
WITH ranked_records AS ( SELECT *, -- 标记每条记录的前一条结束日期、后一条开始日期,确保是连续的成对记录 LAG(Segment_End_Dt) OVER (PARTITION BY party_id, Segment_Type_Cd ORDER BY Segment_Start_Dt) AS prev_end_dt, LEAD(Segment_Start_Dt) OVER (PARTITION BY party_id, Segment_Type_Cd ORDER BY Segment_Start_Dt) AS next_start_dt, ROW_NUMBER() OVER (PARTITION BY party_id, Segment_Type_Cd ORDER BY Segment_Start_Dt) AS record_rank FROM party_segment WHERE -- 只保留问题组合内的记录 EXISTS ( SELECT 1 FROM party_segment ps2 WHERE ps2.party_id = party_segment.party_id AND ps2.Segment_Type_Cd = party_segment.Segment_Type_Cd AND TRIM(ps2.Segment_Value_Cd) = '' ) AND party_id IN (6303031, 6824664, 216502393, 6916270) ) -- 分组合并成对记录 SELECT party_id, Segment_Type_Cd, MIN(Segment_Start_Dt) AS combined_start_dt, -- 取最早的开始日期 -- 处理示例中的`?`,替换为NULL(可根据业务调整) MAX(CASE WHEN Segment_End_Dt != '?' THEN Segment_End_Dt END) AS combined_end_dt, -- 取非空的segment_value_cd(如果需要保留两个值可以用CONCAT) MAX(CASE WHEN TRIM(Segment_Value_Cd) != '' THEN Segment_Value_Cd END) AS combined_value_cd FROM ranked_records GROUP BY party_id, Segment_Type_Cd
合并逻辑说明:
- 用窗口函数
LAG/LEAD确保记录是连续衔接的(比如前一条的结束日期等于后一条的开始日期) - 聚合时可以根据业务需求调整字段处理方式:比如如果需要保留两条记录的所有信息,可以用字符串拼接,或者保留原始字段的数组形式(取决于你的数据库支持)
内容的提问来源于stack exchange,提问作者user3901666
相关产品推荐
相关产品推荐

