我需要从内部表中为每个不同的VKONT 获取具有最高EXBEL寄存器的行。
如果源表中的多行具有相同的最高EXBEL值,则后一个结果表可能包含多行相同的VKONT值。
实际来源表:
serviceusage.*
预期结果表:
SPARTE VKONT EXBEL
05 800000008422 1NSN150900000058
L2 800000008422 1NSN150900000058
05 800000008422 1NSN150900000037
L2 800000008422 1NSN150900000037
05 800000008422 1NSN150900000013
L2 800000008422 1NSN150900000013
05 800000008415 1HSN151200000009
S1 800000008415 1HSN151200000009
05 800000008415 1HSN151200000008
S1 800000008415 1HSN151200000008
L1 800000008422 1NSN150900000050
L1 800000008422 1NSN150900000029
L1 800000008422 1NSN150900000023
05 800000008415 1HSN151200000012
S1 800000008415 1HSN151200000012
05 800000008422 1NSN150900000058
L2 800000008422 1NSN150900000058
05 800000008415 1HSN151200000009
S1 800000008415 1HSN151200000009
我尝试了不同的解决方案,但是没有用。
任何帮助将不胜感激。
劳尔。
答案 0 :(得分:4)
从7.52开始,您可以在内部表上select。示例代码如下。
TYPES:
BEGIN OF ty_s_value,
sparte TYPE char2,
vkont TYPE char12,
exbel TYPE char16,
END OF ty_s_value.
TYPES:
ty_t_value TYPE STANDARD TABLE OF ty_s_value .
DATA:
lt_value TYPE ty_t_value.
lt_value = VALUE #(
( sparte = '05' vkont = '800008422' exbel = '0000000000000001')
( sparte = 'l2' vkont = '800008422' exbel = '0000000000000002')
( sparte = 'l2' vkont = '800008422' exbel = '0000000000000004')
( sparte = '05' vkont = '800008423' exbel = '0000000000000003')
( sparte = 'l2' vkont = '800008423' exbel = '0000000000000002')
( sparte = 'l2' vkont = '800008423' exbel = '0000000000000005')
).
SELECT FROM @lt_value AS a FIELDS a~sparte, a~vkont, MAX( a~exbel ) AS exbel
GROUP BY a~sparte, a~vkont
ORDER BY a~sparte, a~vkont INTO TABLE @DATA(result).
答案 1 :(得分:2)
此功能可用于当前支持的任何发行版, 2 比SORT + DELETE ADJACENT DUPLICATES更快,并且保持原始表不变。
FIELD-SYMBOLS: <fs_itab> LIKE LINE OF lt_original.
DATA: ls_itab LIKE LINE OF lt_original,
lt_hashed TYPE HASHED TABLE OF itab WITH UNIQUE KEY vkont.
LOOP AT lt_original INTO ls_itab.
READ TABLE lt_hashed ASSIGNING <fs_itab>
WITH KEY vkont = ls_itab-vkont.
IF sy-subrc = 0.
IF ls_itab-exbel > <fs_itab>-exbel.
<fs_itab>-exbel = ls_itab-exbel.
<fs_itab>-sparte = ls_itab-sparte. "remove this if not needed"
ENDIF.
ELSE.
INSERT ls_itab INTO TABLE lt_hashed.
ENDIF.
ENDLOOP.
1)SORT + DAD的速度标度为O(n * log(n)),而速度标度为O(n)
答案 2 :(得分:1)
您可以使用SORT
,然后再使用DELETE ADJACENT DUPLICATES
,因为后者会删除某些行组中的所有行,但组中的第一行除外。
SORT itab BY vkont exbel DESCENDING. " Group by VKONT and put highest EXBEL in the group first
DELETE ADJACENT DUPLICATES FROM itab COMPARING VKONT.
如果您需要保持原始的itab
完整,那么可能会有更有效的方法。
答案 3 :(得分:0)
这是REDUCE解决方案,从ABAP 7.40 SP08开始提供REDUCE运算符。
TYPES: BEGIN OF ty_s_value,
sparte TYPE char2,
vkont TYPE char12,
exbel TYPE char16,
END OF ty_s_value.
TYPES: ty_t_value TYPE STANDARD TABLE OF ty_s_value WITH EMPTY KEY.
DATA(lt_tab) =
VALUE ty_t_value(
( sparte = '05' vkont = '800000008422' exbel = '1NSN150900000058')
( sparte = 'L2' vkont = '800000008422' exbel = '1NSN150900000058')
( sparte = '05' vkont = '800000008422' exbel = '1NSN150900000037')
( sparte = 'L2' vkont = '800000008422' exbel = '1NSN150900000037')
( sparte = '05' vkont = '800000008422' exbel = '1NSN150900000013')
( sparte = 'L2' vkont = '800000008422' exbel = '1NSN150900000013')
( sparte = '05' vkont = '800000008415' exbel = '1HSN151200000009')
( sparte = 'S1' vkont = '800000008415' exbel = '1HSN151200000009')
( sparte = '05' vkont = '800000008415' exbel = '1HSN151200000008')
( sparte = 'S1' vkont = '800000008415' exbel = '1HSN151200000008')
( sparte = 'L1' vkont = '800000008422' exbel = '1NSN150900000050')
( sparte = 'L1' vkont = '800000008422' exbel = '1NSN150900000029')
...
).
DATA(lt_result) =
VALUE ty_t_value( FOR GROUPS <group_key> OF <wa> IN lt_tab
GROUP BY ( sparte = <wa>-sparte vkont = <wa>-vkont )
LET max2 =
REDUCE #( INIT max =
VALUE ty_s_value( )
FOR <m> IN GROUP <group_key>
NEXT max = COND #( WHEN <m>-exbel > max-exbel THEN <m> ELSE max ) )
IN ( max2 ) ).
顺便说一句,您的预期结果集缺少L1行,我认为在您的选择中您不仅尊重VKONT,而且尊重SPARTE。