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

Progress中如何按自定义优先级排序并实现临时表邮箱数据去重

Progress OpenEdge 邮箱记录按自定义优先级去重最佳实现方案

核心逻辑是通过显式优先级数值替代字符串默认排序,避免字母序不符合业务规则的问题,同时兼容数据中邮箱类型名的格式差异,去重结果完全确定无随机问题。


步骤1:扩展临时表字段

在原有ttEmail临时表结构中新增一个整数字段iPriority,用于存储邮箱类型的优先级数值(数值越大优先级越高)。
优先级映射规则提前明确:

  • preferred E-mail(含横杠/空格写法变体):优先级4(最高)
  • E-Mail:优先级3
  • 2nd E-mail/2nd-Email:优先级2
  • family E-Mail:优先级1(最低)
  • 未匹配到的未知类型:优先级0

步骤2:导入CSV后为所有记录赋值优先级

你现有的CSV导入逻辑无需改动,导入完成后遍历全量临时表数据,对邮箱类型名做归一化处理(统一替换横杠为空格、去除首尾空格)后匹配优先级,避免因为类型名的格式小差异导致匹配错误:

/* CSV导入完成后执行优先级赋值 */
FOR EACH ttEmail:
    /* 归一化类型名:替换横杠为空格、去除首尾空白,兼容不同写法 */
    CASE TRIM(REPLACE(ttEmail.emailTypeDescription, "-", " ")):
        WHEN "preferred E mail" THEN ttEmail.iPriority = 4.
        WHEN "E Mail" THEN ttEmail.iPriority = 3.
        WHEN "2nd E mail" THEN ttEmail.iPriority = 2.
        WHEN "family E Mail" THEN ttEmail.iPriority = 1.
        OTHERWISE ttEmail.iPriority = 0.
    END CASE.
END.

步骤3:按规则排序去重

定义一个结构和ttEmail完全一致的干净结果临时表ttEmailClean,遍历原临时表时先按uniqueid升序分组,同组内按iPriority降序排列,每个分组只取第一条记录存入结果表,即为每个id下优先级最高的有效记录:

EMPTY TEMP-TABLE ttEmailClean.

/* 排序规则:先按id分组,同id下优先级从高到低排列 */
FOR EACH ttEmail 
    BREAK BY ttEmail.uniqueid 
    BY ttEmail.iPriority DESCENDING:
    
    /* 每个id分组的第一条即为最高优先级记录,存入结果表 */
    IF FIRST-OF(ttEmail.uniqueid) THEN DO:
        CREATE ttEmailClean.
        BUFFER-COPY ttEmail TO ttEmailClean.
    END.
END.

方案说明

  • 去重逻辑完全确定:所有记录的优先级为显式赋值,不存在依赖遍历顺序、索引顺序的随机问题,结果100%符合业务规则
  • 兼容脏数据:类型名归一化处理可以覆盖示例中出现的preferred E-mail/preferred-Email、2nd E-mail/2nd-Email这类写法差异,不会漏判优先级
  • 执行效率高:全流程仅两次全表遍历,即使导入十万级以上的CSV数据也不会有明显性能损耗
  • 维护成本低:后续调整优先级顺序、新增邮箱类型时,仅需修改优先级赋值的CASE分支即可,无需改动排序、去重逻辑

内容的提问来源于stack exchange,提问作者Felice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:12:16