Compilation of ABAP SQL window functions from the ABAP Keyword Documentation
Share

[[{“value”:”

If like me you don’t know well the ABAP SQL window functions (partitions with OVER, window functions) and have difficulties to quickly choose between them, here’s a compilation of the ABAP Keyword Documentation + ABAP results. It concerns ABAP 7.58.

FIRST_VALUE, LAST_VALUE

Content of table DEMO_UPDATE:

ID COL1 COL2 COL3
A 1 5 62
B 1 4 62
C 1 8 62
D 1 10 62
E 1 978 62
F 1 927 88
G 1 0 99
H 1 0 124
I 2 1001 44
J 2 43 44
K 2 4 44
L 2 17 44
M 2 33 44
N 2 100 44
O 2 101 44
P 2 5839 55
Q 2 548 77
R 2 18 133
S 3 554346 23
T 3 1001 111

ABAP SQL:

SELECT
id,
col1,
col2,
col3,
FIRST_VALUE( col2 ) OVER( PARTITION BY col1 ORDER BY col3 )
AS first_value,
LAST_VALUE( col2 ) OVER( PARTITION BY col1 ORDER BY col3 )
AS last_value,
LAST_VALUE( col2 ) OVER( PARTITION BY col1 ORDER BY col3
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING )
AS last_value_correct
FROM demo_update
INTO TABLE @FINAL(result).

Result (copied from ABAP Keyword Documentation):

 

Sandra_Rossi_2-1757507348307.png

LAG, LEAD

Content of table DEMO_EXPRESSIONS:

ID CHAR1 CHAR2 NUM1
b AA AA 6
d AA AA 3
e AA AA 4
t AA AA 8
c AA AB 6
v AA AB 1
a AA BA 5
f AA BA 8
k AB BB 2
r AB BB 4
n BA AA 7
u BA AB 4
y BA AB 10
o BA BA 6
x BA BA 10
i BA BB 9
m BA BB 9
p BA BB 6
s BA BB 6
g BB AB 5
l BB AB 4
q BB AB 4
w BB AB 1
h BB BA 7
j BB BB 6

ABAP SQL:

SELECT char1, char2,
num1,
ROW_NUMBER( )
OVER( PARTITION BY char1 ORDER BY char2 )
AS rnum,
LEAD( CAST( num1 AS CHAR( 11 ) ), 1, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 )
AS lead1,
LAG( CAST( num1 AS CHAR( 11 ) ), 1, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 )
AS lag1,
LEAD( CAST( num1 AS CHAR( 11 ) ), 2, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 )
AS lead2,
LAG( CAST( num1 AS CHAR( 11 ) ), 2, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 )
AS lag2,
LEAD( CAST( num1 AS CHAR( 11 ) ), 10, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 )
AS lead10,
LAG( CAST( num1 AS CHAR( 11 ) ), 10, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 )
AS lag10
FROM demo_expressions
ORDER BY char1, char2 “#EC CI_NOWHERE
INTO TABLE @FINAL(windowed_order_ascending) ##no_text.

Result:

CHAR1 CHAR2 NUM1 RNUM LEAD1 LAG1 LEAD2 LAG2 LEAD10 LAG10
AA AA 6 1 3 Nope 4 Nope Nope Nope
AA AA 3 2 4 6 8 Nope Nope Nope
AA AA 4 3 8 3 6 6 Nope Nope
AA AA 8 4 6 4 1 3 Nope Nope
AA AB 6 5 1 8 5 4 Nope Nope
AA AB 1 6 5 6 8 8 Nope Nope
AA BA 5 7 8 1 Nope 6 Nope Nope
AA BA 8 8 Nope 5 Nope 1 Nope Nope
AB BB 2 1 4 Nope Nope Nope Nope Nope
AB BB 4 2 Nope 2 Nope Nope Nope Nope
BA AA 7 1 4 Nope 10 Nope Nope Nope
BA AB 4 2 10 7 6 Nope Nope Nope
BA AB 10 3 6 4 10 7 Nope Nope
BA BA 6 4 10 10 9 4 Nope Nope
BA BA 10 5 9 6 9 10 Nope Nope
BA BB 9 6 9 10 6 6 Nope Nope
BA BB 9 7 6 9 6 10 Nope Nope
BA BB 6 8 6 9 Nope 9 Nope Nope
BA BB 6 9 Nope 6 Nope 9 Nope Nope
BB AB 5 1 4 Nope 4 Nope Nope Nope
BB AB 4 2 4 5 1 Nope Nope Nope
BB AB 4 3 1 4 7 5 Nope Nope
BB AB 1 4 7 4 6 4 Nope Nope
BB BA 7 5 6 1 Nope 4 Nope Nope
BB BB 6 6 Nope 7 Nope 1 Nope Nope

ABAP SQL:

SELECT char1, char2,
num1,
ROW_NUMBER( )
OVER( PARTITION BY char1 ORDER BY char2 DESCENDING )
AS rnum,
LEAD( CAST( num1 AS CHAR( 11 ) ), 1, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 DESCENDING )
AS lead1,
LAG( CAST( num1 AS CHAR( 11 ) ), 1, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 DESCENDING )
AS lag1,
LEAD( CAST( num1 AS CHAR( 11 ) ), 2, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 DESCENDING )
AS lead2,
LAG( CAST( num1 AS CHAR( 11 ) ), 2, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 DESCENDING )
AS lag2,
LEAD( CAST( num1 AS CHAR( 11 ) ), 10, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 DESCENDING )
AS lead10,
LAG( CAST( num1 AS CHAR( 11 ) ), 10, ‘Nope’ )
OVER( PARTITION BY char1 ORDER BY char2 DESCENDING )
AS lag10
FROM demo_expressions
ORDER BY char1, char2 “#EC CI_NOWHERE
INTO TABLE @FINAL(windowed_order_descending) ##no_text.

Result:

CHAR1 CHAR2 NUM1 RNUM LEAD1 LAG1 LEAD2 LAG2 LEAD10 LAG10
AA AA 6 5 3 1 4 6 Nope Nope
AA AA 3 6 4 6 8 1 Nope Nope
AA AA 4 7 8 3 Nope 6 Nope Nope
AA AA 8 8 Nope 4 Nope 3 Nope Nope
AA AB 6 3 1 8 6 5 Nope Nope
AA AB 1 4 6 6 3 8 Nope Nope
AA BA 5 1 8 Nope 6 Nope Nope Nope
AA BA 8 2 6 5 1 Nope Nope Nope
AB BB 2 1 4 Nope Nope Nope Nope Nope
AB BB 4 2 Nope 2 Nope Nope Nope Nope
BA AA 7 9 Nope 10 Nope 4 Nope Nope
BA AB 4 7 10 10 7 6 Nope Nope
BA AB 10 8 7 4 Nope 10 Nope Nope
BA BA 6 5 10 6 4 6 Nope Nope
BA BA 10 6 4 6 10 6 Nope Nope
BA BB 9 1 9 Nope 6 Nope Nope Nope
BA BB 9 2 6 9 6 Nope Nope Nope
BA BB 6 3 6 9 6 9 Nope Nope
BA BB 6 4 6 6 10 9 Nope Nope
BB AB 5 3 4 7 4 6 Nope Nope
BB AB 4 4 4 5 1 7 Nope Nope
BB AB 4 5 1 4 Nope 5 Nope Nope
BB AB 1 6 Nope 4 Nope 4 Nope Nope
BB BA 7 2 5 6 4 Nope Nope Nope
BB BB 6 1 7 Nope 5 Nope Nope Nope

NTILE

Content of table DEMO_EMPLOYEES:

NAME SALARY
Lothar Sudhoff 1354
Johannes Legrand 1468
Holm Trensch 2324
Johann Buchholm 3245
Christa Martin 3247
Laura Lindwurm 3247
Amelie Babilon 3485
Thilo Eichbaum 5436
Ulla Babilon 5489
Illya Gueldenpfennig 7453
Anna Picard 7453

ABAP SQL:

SELECT name,
salary,
NTILE( 5 ) OVER( ORDER BY salary ) AS ntile
FROM demo_employees
INTO TABLE @FINAL(result).

Result:

NAME SALARY NTILE
Lothar Sudhoff 1354 1
Johannes Legrand 1468 1
Holm Trensch 2324 1
Johann Buchholm 3245 2
Christa Martin 3247 2
Laura Lindwurm 3247 3
Amelie Babilon 3485 3
Thilo Eichbaum 5436 4
Ulla Babilon 5489 4
Illya Gueldenpfennig 7453 5
Anna Picard 7453 5

count, dense_rank, max, min, rank, row_number, sum

Content of table DEMO_EXPRESSIONS:

ID CHAR1 CHAR2 NUM1
g AA AB 3
i AA AB 7
l AA AB 6
p AA AB 6
c AA BA 10
a AA BB 7
b AA BB 10
e AB AB 4
m AB AB 8
w AB AB 1
r AB BA 1
f AB BB 9
n AB BB 1
s AB BB 4
u AB BB 7
h BA AA 2
x BA AA 8
o BA AB 10
d BA BA 6
v BA BB 8
y BA BB 1
k BB AA 7
j BB BA 2
t BB BA 4
q BB BB 10

ABAP SQL:

SELECT char1, char2,
num1,
COUNT(*) OVER( PARTITION BY char1 ) AS cnt,
ROW_NUMBER( ) OVER( PARTITION BY char1 ) AS rnum,
‘-‘ AS rank,
‘-‘ AS schlank,
MAX( num1 ) OVER( PARTITION BY char1 ) AS max,
MIN( num1 ) OVER( PARTITION BY char1 ) AS min,
SUM( num1 ) OVER( PARTITION BY char1 ) AS sum,
division( 100 * num1,
SUM( num1 ) OVER( PARTITION BY char1 ),
2 ) AS perc
FROM demo_expressions
ORDER BY char1, char2
INTO TABLE @FINAL(windowed_no_order).

Result:

CHAR1 CHAR2 NUM1 CNT RNUM RANK SCHLANK MAX MIN SUM PERC
AA AB 3 7 4 10 3 49 6.12
AA AB 7 7 5 10 3 49 14.29
AA AB 6 7 6 10 3 49 12.24
AA AB 6 7 7 10 3 49 12.24
AA BA 10 7 3 10 3 49 20.41
AA BB 7 7 1 10 3 49 14.29
AA BB 10 7 2 10 3 49 20.41
AB AB 4 8 1 9 1 35 11.43
AB AB 8 8 3 9 1 35 22.86
AB AB 1 8 8 9 1 35 2.86
AB BA 1 8 5 9 1 35 2.86
AB BB 9 8 2 9 1 35 25.71
AB BB 1 8 4 9 1 35 2.86
AB BB 4 8 6 9 1 35 11.43
AB BB 7 8 7 9 1 35 20.0
BA AA 2 6 2 10 1 35 5.71
BA AA 8 6 5 10 1 35 22.86
BA AB 10 6 3 10 1 35 28.57
BA BA 6 6 1 10 1 35 17.14
BA BB 8 6 4 10 1 35 22.86
BA BB 1 6 6 10 1 35 2.86
BB AA 7 4 2 10 2 23 30.43
BB BA 2 4 1 10 2 23 8.7
BB BA 4 4 4 10 2 23 17.39
BB BB 10 4 3 10 2 23 43.48

ABAP SQL:

SELECT char1, char2,
num1,
COUNT(*) OVER( PARTITION BY char1
ORDER BY char2 ) AS cnt,
ROW_NUMBER( ) OVER( PARTITION BY char1
ORDER BY char2 ) AS rnum,
RANK( ) OVER( PARTITION BY char1
ORDER BY char2 ) AS rank,
DENSE_RANK( ) OVER( PARTITION BY char1
ORDER BY char2 ) AS schlank,
MAX( num1 ) OVER( PARTITION BY char1
ORDER BY char2 ) AS max,
MIN( num1 ) OVER( PARTITION BY char1
ORDER BY char2 ) AS min,
SUM( num1 ) OVER( PARTITION BY char1
ORDER BY char2 ) AS sum,
division( 100 * num1,
SUM( num1 ) OVER( PARTITION BY char1
ORDER BY char2 ),
2 ) AS perc
FROM demo_expressions
ORDER BY char1, char2
INTO TABLE @FINAL(windowed_order_ascending).

Result:

CHAR1 CHAR2 NUM1 CNT RNUM RANK SCHLANK MAX MIN SUM PERC
AA AB 3 4 1 1 1 7 3 22 13.64
AA AB 7 4 2 1 1 7 3 22 31.82
AA AB 6 4 3 1 1 7 3 22 27.27
AA AB 6 4 4 1 1 7 3 22 27.27
AA BA 10 5 5 5 2 10 3 32 31.25
AA BB 7 7 6 6 3 10 3 49 14.29
AA BB 10 7 7 6 3 10 3 49 20.41
AB AB 4 3 1 1 1 8 1 13 30.77
AB AB 8 3 2 1 1 8 1 13 61.54
AB AB 1 3 3 1 1 8 1 13 7.69
AB BA 1 4 4 4 2 8 1 14 7.14
AB BB 9 8 5 5 3 9 1 35 25.71
AB BB 1 8 6 5 3 9 1 35 2.86
AB BB 4 8 7 5 3 9 1 35 11.43
AB BB 7 8 8 5 3 9 1 35 20.0
BA AA 2 2 1 1 1 8 2 10 20.0
BA AA 8 2 2 1 1 8 2 10 80.0
BA AB 10 3 3 3 2 10 2 20 50.0
BA BA 6 4 4 4 3 10 2 26 23.08
BA BB 8 6 5 5 4 10 1 35 22.86
BA BB 1 6 6 5 4 10 1 35 2.86
BB AA 7 1 1 1 1 7 7 7 100.0
BB BA 2 3 2 2 2 7 2 13 15.38
BB BA 4 3 3 2 2 7 2 13 30.77
BB BB 10 4 4 4 3 10 2 23 43.48

ABAP SQL:

SELECT char1, char2,
num1,
COUNT(*) OVER( PARTITION BY char1
ORDER BY char2 DESCENDING ) AS cnt,
ROW_NUMBER( ) OVER( PARTITION BY char1
ORDER BY char2 DESCENDING ) AS rnum,
RANK( ) OVER( PARTITION BY char1
ORDER BY char2 DESCENDING ) AS rank,
DENSE_RANK( ) OVER( PARTITION BY char1
ORDER BY char2 DESCENDING ) AS schlank,
MAX( num1 ) OVER( PARTITION BY char1
ORDER BY char2 DESCENDING ) AS max,
MIN( num1 ) OVER( PARTITION BY char1
ORDER BY char2 DESCENDING ) AS min,
SUM( num1 ) OVER( PARTITION BY char1
ORDER BY char2 DESCENDING ) AS sum,
division( 100 * num1,
SUM( num1 ) OVER( PARTITION BY char1
ORDER BY char2 DESCENDING ),
2 ) AS perc
FROM demo_expressions
ORDER BY char1 DESCENDING, char2 DESCENDING
INTO TABLE @FINAL(windowed_order_descending).

Result:

CHAR1 CHAR2 NUM1 CNT RNUM RANK SCHLANK MAX MIN SUM PERC
BB BB 10 1 1 1 1 10 10 10 100.0
BB BA 2 3 2 2 2 10 2 16 12.5
BB BA 4 3 3 2 2 10 2 16 25.0
BB AA 7 4 4 4 3 10 2 23 30.43
BA BB 8 2 1 1 1 8 1 9 88.89
BA BB 1 2 2 1 1 8 1 9 11.11
BA BA 6 3 3 3 2 8 1 15 40.0
BA AB 10 4 4 4 3 10 1 25 40.0
BA AA 2 6 5 5 4 10 1 35 5.71
BA AA 8 6 6 5 4 10 1 35 22.86
AB BB 9 4 1 1 1 9 1 21 42.86
AB BB 1 4 2 1 1 9 1 21 4.76
AB BB 4 4 3 1 1 9 1 21 19.05
AB BB 7 4 4 1 1 9 1 21 33.33
AB BA 1 5 5 5 2 9 1 22 4.55
AB AB 4 8 6 6 3 9 1 35 11.43
AB AB 8 8 7 6 3 9 1 35 22.86
AB AB 1 8 8 6 3 9 1 35 2.86
AA BB 7 2 1 1 1 10 7 17 41.18
AA BB 10 2 2 1 1 10 7 17 58.82
AA BA 10 3 3 3 2 10 7 27 37.04
AA AB 3 7 4 4 3 10 3 49 6.12
AA AB 7 7 5 4 3 10 3 49 14.29
AA AB 6 7 6 4 3 10 3 49 12.24
AA AB 6 7 7 4 3 10 3 49 12.24

 

“}]] 

  Read More Technology Blog Posts by Members articles 

#abap

By ali