Progress中如何按自定义优先级排序并实现临时表邮箱数据去重
Progress OpenEdge 邮箱记录按自定义优先级去重最佳实现方案
核心逻辑是通过显式优先级数值替代字符串默认排序,避免字母序不符合业务规则的问题,同时兼容数据中邮箱类型名的格式差异,去重结果完全确定无随机问题。
步骤1:扩展临时表字段
在原有ttEmail临时表结构中新增一个整数字段iPriority,用于存储邮箱类型的优先级数值(数值越大优先级越高)。
优先级映射规则提前明确:
preferred E-mail(含横杠/空格写法变体):优先级4(最高)E-Mail:优先级32nd E-mail/2nd-Email:优先级2family 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
相关产品推荐
相关产品推荐

