You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

识别并合并因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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:05:11