SAP/ABAP 코드

(ABAP 코드) WINDOW FUNCTION

haramang 2022. 9. 4. 19:39


** https://blogs.sap.com/2021/11/24/window-expressions-in-abap-sql/
** https://blogs.sap.com/2021/11/30/new-window-functions-in-abap-sql/

SELECT char1char2num1,
       COUNT(*OVERPARTITION BY char1char2 AS cnt,
       MAXnum1 OVERPARTITION BY char1char2 AS max,
       MINnum1 OVERPARTITION BY char1char2 AS min,
       SUMnum1 OVERPARTITION BY char1char2 AS sum,
       RANKOVERPARTITION BY char1char2 ORDER BY num1 AS rank,            " Allow Duplicates
*         rank( ) over( partition by char1, char2 order by num1 DESCENDING ) as rank " Don't allow Duplicates
       DENSE_RANKOVERPARTITION BY char1char2 ORDER BY num1 AS dens_rank
  FROM demo_expressions
  ORDER BY char1char2
  INTO TABLE @DATA(window_test_no_order).




**SELECT char1 && '_' && char2 AS group,
**           num1,
**           COUNT(*)      OVER( PARTITION BY char1, char2 ) AS cnt,
**           ROW_NUMBER( ) OVER( PARTITION BY char1, char2 ) AS rnum,
**           MIN( num1 )   OVER( PARTITION BY char1, char2 ) AS min,
**           MAX( num1 )   OVER( PARTITION BY char1, char2 ) AS max,
**           SUM( num1 )   OVER( PARTITION BY char1, char2 ) AS sum,
**           division( 100 * num1,
**                     SUM( num1 ) OVER( PARTITION BY char1, char2 ),
**                     2 ) AS perc
**           FROM demo_expressions
**           ORDER BY group
**           INTO TABLE @DATA(windowed).



*&---------------------------------------------------------------------*
*& .. 자주 쓰일 만한 것 정리
*&---------------------------------------------------------------------*
SELECT carridconnidprice,
       COUNT)   OVERORDER BY carridconnid
                          ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW )
                          AS cnt_by_all,
       COUNT)   OVERPARTITION BY carridconnid
                          ORDER BY carridconnid
                          ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW )
                          AS cnt_by_flight,
       COUNT)   OVERORDER BY carridconnid
                          ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING )
                          AS cnt_reverse_by_all,
       COUNT)   OVERPARTITION BY carrid ,connid
                          ORDER BY carridconnid
                          ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING )
                          AS cnt_reverse_by_flight,
       AVGprice OVERORDER BY carridconnid
                          ROWS BETWEEN PRECEDING AND FOLLOWING )
                          AS average_by_all,
       AVGprice OVERPARTITION BY carridconnid
                          ORDER BY carridconnid
                          ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW )
                          AS average_by_flight,
       SUMprice OVERORDER BY carridconnid
                          ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW )
                          AS accumulate_by_all,
       SUMprice OVERPARTITION BY carridconnid
                          ORDER BY carridconnidprice
                          ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW  )
                          AS accumulate_by_flight
  FROM sflight
  ORDER BY carridconnidaccumulate_by_flight DESCENDING
  INTO TABLE @DATA(gt_flight).

DATA(gt_maxgt_flight[].
CLEARgt_max[].


** .. 각 항공편 별 마지막 값 구하기

LOOP AT gt_flight INTO DATA(ls_flight)
                    GROUP BY carrid ls_flight-carrid
                               connid ls_flight-connid )
                    ASCENDING
*                    WITHOUT MEMBERS
                    ASSIGNING FIELD-SYMBOL(<group>).
  APPEND INITIAL LINE TO gt_max ASSIGNING FIELD-SYMBOL(<gs_max>).
  IF <gs_max> IS ASSIGNED.
    LOOP AT GROUP <group> ASSIGNING FIELD-SYMBOL(<fs_group>).
      IF <fs_group> IS ASSIGNED.
        <gs_max> <fs_group>.
        UNASSIGN <fs_group>.
        UNASSIGN <gs_max>.
        EXIT.
      ENDIF.
    ENDLOOP.
  ENDIF.

ENDLOOP.
*
*LOOP AT gt_flight ASSIGNING FIELD-SYMBOL(<gs_flight>).
*  ON CHANGE OF <gs_flight>-connid.
*    APPEND INITIAL LINE TO gt_max ASSIGNING FIELD-SYMBOL(<gs_max>).
*    <gs_max> = <gs_flight>.
*    UNASSIGN <gs_max>.
*  ENDON.
*ENDLOOP.




*&---------------------------------------------------------------------*
**& .. LEAD, LAG
*&---------------------------------------------------------------------*
*https://help.sap.com/docs/SAP_HANA_PLATFORM/4fe29514fd584807ac9f2a04f6754767/5932eebb6208406590071eb65c6caa83.html?locale=en-US&version=2.0.05

SELECT num1 AS number,
     num1 LEADnum1 OVERORDER BY id AS diff_lead,
     num1 LAG(  num1 OVERORDER BY id AS diff_lag
FROM demo_expressions
ORDER BY id
INTO TABLE @DATA(lead_lag_diffs)
INDICATORS NULL STRUCTURE null_ind.

SELECT id,
  num1,
  LEADnum1 OVERPARTITION BY id ORDER BY num1 AS lead,
  LEADnum11num1 OVERPARTITION BY id ORDER BY num1 AS lead2,
  LAGnum1 OVERPARTITION BY id ORDER BY num1 AS lag,
  LAGnum12num1 OVERPARTITION BY id ORDER BY num1 AS lag2
 FROM demo_expressions INTO TABLE @DATA(lead_lag).



*&---------------------------------------------------------------------*
**& .. FIRST_VALUE and LAST_VALUE
*&---------------------------------------------------------------------*
SELECT
      id,
      col1,
      col2,
      col3,
      FIRST_VALUEcol2 OVERPARTITION BY col1 ORDER BY col3 )
                  AS first_value,
      LAST_VALUEcol2 OVERPARTITION BY col1 ORDER BY col3 )
                  AS last_value,
      LAST_VALUEcol2 OVERPARTITION BY col1 ORDER BY col3
                  ROWS BETWEEN UNBOUNDED PRECEDING
                  AND UNBOUNDED FOLLOWING )
                  AS last_value_correct
      FROM demo_update
      INTO TABLE @DATA(result).

BREAK-POINT.



*&---------------------------------------------------------------------*
**& .. NTILE
*&---------------------------------------------------------------------*

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


CLASS demo DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
      main,
      class_constructor.
ENDCLASS.

CLASS demo IMPLEMENTATION.
  METHOD main.
    DATA(outcl_demo_output=>new).

    SELECT char1char2,
           num1,
           COUNT(*)      OVERPARTITION BY char1 AS cnt,
           ROW_NUMBEROVERPARTITION BY char1 AS rnum,
           '-'                                      AS rank,
           '-'                                      AS schlank,
           MAXnum1 )   OVERPARTITION BY char1 AS max,
           MINnum1 )   OVERPARTITION BY char1 AS min,
           SUMnum1 )   OVERPARTITION BY char1 AS sum,
           division100 * num1,
                     SUMnum1 OVERPARTITION BY char1 ),
                     AS perc
           FROM demo_expressions
           ORDER BY char1char2
           INTO TABLE @DATA(windowed_no_order).
    out->writewindowed_no_order ).

    SELECT char1char2,
           num1,
           COUNT(*)      OVERPARTITION BY char1
                               ORDER BY char2 AS cnt,
           ROW_NUMBEROVERPARTITION BY char1
                               ORDER BY char2 AS rnum,
           RANK)       OVERPARTITION BY char1
                               ORDER BY char2 AS rank,
           DENSE_RANKOVERPARTITION BY char1
                               ORDER BY char2 AS schlank,
           MAXnum1 )   OVERPARTITION BY char1
                               ORDER BY char2 AS max,
           MINnum1 )   OVERPARTITION BY char1
                               ORDER BY char2 AS min,
           SUMnum1 )   OVERPARTITION BY char1
                               ORDER BY char2 AS sum,
           division100 * num1,
                     SUMnum1 OVERPARTITION BY char1
                                       ORDER BY char2 ),
                     AS perc
           FROM demo_expressions
           ORDER BY char1char2
           INTO TABLE @DATA(windowed_order_ascending).
    out->writewindowed_order_ascending ).

    SELECT char1char2,
           num1,
           COUNT(*)      OVERPARTITION BY char1
                               ORDER BY char2 DESCENDING AS cnt,
           ROW_NUMBEROVERPARTITION BY char1
                               ORDER BY char2 DESCENDING AS rnum,
           RANK)       OVERPARTITION BY char1
                               ORDER BY char2 DESCENDING AS rank,
           DENSE_RANKOVERPARTITION BY char1
                               ORDER BY char2 DESCENDING AS schlank,
           MAXnum1 )   OVERPARTITION BY char1
                               ORDER BY char2 DESCENDING AS max,
           MINnum1 )   OVERPARTITION BY char1
                               ORDER BY char2 DESCENDING AS min,
           SUMnum1 )   OVERPARTITION BY char1
                               ORDER BY char2 DESCENDING AS sum,
           division100 * num1,
                     SUMnum1 OVERPARTITION BY char1
                                 ORDER BY char2 DESCENDING ),
                     AS perc
           FROM demo_expressions
           ORDER BY char1 DESCENDINGchar2 DESCENDING
           INTO TABLE @DATA(windowed_order_descending).
    out->writewindowed_order_descending ).

    out->display).
  ENDMETHOD.
  METHOD class_constructor.
    TYPES tab_type TYPE STANDARD TABLE OF
                   demo_expressions WITH EMPTY KEY.
    DELETE FROM demo_expressions.
    INSERT demo_expressions FROM TABLE @REDUCE tab_type(
      LET r1 cl_abap_random_int=>create(
                 seed CONV isy-uzeit min max 10 )
          r2 cl_abap_random_int=>create(
                 seed CONV ir1->get_nextmin max )
          `AB` IN
      INIT t TYPE tab_type
      FOR THEN UNTIL >= 25
      NEXT VALUE #(
                 BASE t id    sy-abcde+i(1)
                          num1  r1->get_next)
                          char1 substringval c
                                             off r2->get_next)
                                             len &&
                                  substringval c
                                             off r2->get_next)
                                             len )
                          char2 substringval c
                                             off r2->get_next)
                                             len &&
                                  substringval c
                                             off r2->get_next)
                                             len ).
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  demo=>main).