如何查找internal table中F1字段的重复值并生成去重新内表
ABAP 内表按指定字段筛选重复组实现方案
以下方案适配你的需求:基于F1字段筛选源内表中出现至少2次的F1分组,每个分组仅保留1条记录写入新内表。
假设源内表名为gt_source,目标内表gt_result与源内表结构一致,你可以根据实际情况替换变量名。
方法1:全版本兼容写法
无需高版本ABAP语法支持,逻辑清晰易调试:
- 第一步:按F1字段排序源内表
SORT gt_source BY F1.
- 第二步:定义辅助变量统计每个F1的出现次数
TYPES: BEGIN OF ty_f1_stat, f1 TYPE 你源表F1对应的数据类型, count TYPE i, END OF ty_f1_stat. DATA: lt_f1_stat TYPE HASHED TABLE OF ty_f1_stat WITH UNIQUE KEY f1, ls_f1_stat TYPE ty_f1_stat, ls_source TYPE 源内表结构名, ls_result TYPE 目标内表结构名. " 遍历源表统计次数 LOOP AT gt_source INTO ls_source. READ TABLE lt_f1_stat INTO ls_f1_stat WITH TABLE KEY f1 = ls_source-f1. IF sy-subrc = 0. ls_f1_stat-count = ls_f1_stat-count + 1. MODIFY TABLE lt_f1_stat FROM ls_f1_stat. ELSE. ls_f1_stat-f1 = ls_source-f1. ls_f1_stat-count = 1. INSERT TABLE lt_f1_stat FROM ls_f1_stat. ENDIF. ENDLOOP.
- 第三步:筛选符合要求的记录写入目标表
LOOP AT gt_source INTO ls_source. READ TABLE lt_f1_stat INTO ls_f1_stat WITH TABLE KEY f1 = ls_source-f1. " 仅保留出现次数≥2的F1分组,且每个分组只写一次 IF ls_f1_stat-count >= 2. READ TABLE gt_result INTO ls_result WITH KEY f1 = ls_source-f1. IF sy-subrc <> 0. APPEND ls_source TO gt_result. ENDIF. ENDIF. ENDLOOP.
方法2:ABAP 7.40及以上版本精简写法
用GROUP BY语法直接完成分组筛选,代码更短:
LOOP AT gt_source INTO DATA(ls_src) GROUP BY ( f1 = ls_src-f1 ) INTO DATA(grp_f1). " 仅处理行数≥2的分组 IF lines( VALUE #( FOR <row> IN GROUP grp_f1 ( <row> ) ) ) >= 2. " 取分组第一条写入目标表 APPEND CORRESPONDING #( grp_f1[ 1 ] ) TO gt_result. ENDIF. ENDLOOP.
注意事项
- 如果需要保留每个重复组内特定的行(比如F2值最大的行、最新插入的行),只需调整取分组行的逻辑即可
- 你的数据量仅300行,两种写法的性能没有差异,优先选择你更容易调试维护的方案即可
内容的提问来源于stack exchange,提问作者user16365685
相关产品推荐
相关产品推荐

