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

如何查找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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:27:03