269 lines
5.3 KiB
SQL
269 lines
5.3 KiB
SQL
# name: test/sql/window/test_mad_window.test
|
|
# description: Test MAD aggregate as a window function
|
|
# group: [window]
|
|
|
|
statement ok
|
|
SET default_null_order='nulls_first';
|
|
|
|
statement ok
|
|
PRAGMA enable_verification
|
|
|
|
statement ok
|
|
create table mads as select range r from range(20) union all values (NULL), (NULL), (NULL);
|
|
|
|
query IIII
|
|
SELECT r % 2 as p, r, r/3.0, mad(r/3.0) over (partition by r % 2 order by r)
|
|
FROM mads ORDER BY 1, 2
|
|
----
|
|
NULL NULL NULL NULL
|
|
NULL NULL NULL NULL
|
|
NULL NULL NULL NULL
|
|
0 0 0.000000 0.000000
|
|
0 2 0.666667 0.333333
|
|
0 4 1.333333 0.666667
|
|
0 6 2.000000 0.666667
|
|
0 8 2.666667 0.666667
|
|
0 10 3.333333 1.000000
|
|
0 12 4.000000 1.333333
|
|
0 14 4.666667 1.333333
|
|
0 16 5.333333 1.333333
|
|
0 18 6.000000 1.666667
|
|
1 1 0.333333 0.000000
|
|
1 3 1.000000 0.333333
|
|
1 5 1.666667 0.666667
|
|
1 7 2.333333 0.666667
|
|
1 9 3.000000 0.666667
|
|
1 11 3.666667 1.000000
|
|
1 13 4.333333 1.333333
|
|
1 15 5.000000 1.333333
|
|
1 17 5.666667 1.333333
|
|
1 19 6.333333 1.666667
|
|
|
|
query III
|
|
SELECT r, r/3.0, mad(r/3.0) over (order by r rows between 1 preceding and 1 following)
|
|
FROM mads ORDER BY 1, 2, 3
|
|
----
|
|
NULL NULL NULL
|
|
NULL NULL NULL
|
|
NULL NULL 0.000000
|
|
0 0.000000 0.166667
|
|
1 0.333333 0.333333
|
|
2 0.666667 0.333333
|
|
3 1.000000 0.333333
|
|
4 1.333333 0.333333
|
|
5 1.666667 0.333333
|
|
6 2.000000 0.333333
|
|
7 2.333333 0.333333
|
|
8 2.666667 0.333333
|
|
9 3.000000 0.333333
|
|
10 3.333333 0.333333
|
|
11 3.666667 0.333333
|
|
12 4.000000 0.333333
|
|
13 4.333333 0.333333
|
|
14 4.666667 0.333333
|
|
15 5.000000 0.333333
|
|
16 5.333333 0.333333
|
|
17 5.666667 0.333333
|
|
18 6.000000 0.333333
|
|
19 6.333333 0.166667
|
|
|
|
query III
|
|
SELECT r, r/3.0, mad(r/3.0) over (order by r rows between 1 preceding and 3 following) FROM mads ORDER BY 1, 2, 3
|
|
----
|
|
NULL NULL 0.000000
|
|
NULL NULL 0.166667
|
|
NULL NULL 0.333333
|
|
0 0.000000 0.333333
|
|
1 0.333333 0.333333
|
|
2 0.666667 0.333333
|
|
3 1.000000 0.333333
|
|
4 1.333333 0.333333
|
|
5 1.666667 0.333333
|
|
6 2.000000 0.333333
|
|
7 2.333333 0.333333
|
|
8 2.666667 0.333333
|
|
9 3.000000 0.333333
|
|
10 3.333333 0.333333
|
|
11 3.666667 0.333333
|
|
12 4.000000 0.333333
|
|
13 4.333333 0.333333
|
|
14 4.666667 0.333333
|
|
15 5.000000 0.333333
|
|
16 5.333333 0.333333
|
|
17 5.666667 0.333333
|
|
18 6.000000 0.333333
|
|
19 6.333333 0.166667
|
|
|
|
# Scattered NULLs
|
|
query IIII
|
|
SELECT r % 3 as p, r, n, mad(n) over (partition by r % 3 order by r)
|
|
FROM (SELECT r, CASE r % 2 WHEN 0 THEN r ELSE NULL END AS n FROM mads) nulls
|
|
ORDER BY 1, 2
|
|
----
|
|
NULL NULL NULL NULL
|
|
NULL NULL NULL NULL
|
|
NULL NULL NULL NULL
|
|
0 0 0 0.000000
|
|
0 3 NULL 0.000000
|
|
0 6 6 3.000000
|
|
0 9 NULL 3.000000
|
|
0 12 12 6.000000
|
|
0 15 NULL 6.000000
|
|
0 18 18 6.000000
|
|
1 1 NULL NULL
|
|
1 4 4 0.000000
|
|
1 7 NULL 0.000000
|
|
1 10 10 3.000000
|
|
1 13 NULL 3.000000
|
|
1 16 16 6.000000
|
|
1 19 NULL 6.000000
|
|
2 2 2 0.000000
|
|
2 5 NULL 0.000000
|
|
2 8 8 3.000000
|
|
2 11 NULL 3.000000
|
|
2 14 14 6.000000
|
|
2 17 NULL 6.000000
|
|
|
|
query III
|
|
SELECT r, n, mad(n) over (order by r rows between 1 preceding and 1 following)
|
|
FROM (SELECT r, CASE r % 2 WHEN 0 THEN r ELSE NULL END AS n FROM mads) nulls
|
|
ORDER BY 1
|
|
----
|
|
NULL NULL NULL
|
|
NULL NULL NULL
|
|
NULL NULL 0.000000
|
|
0 0 0.000000
|
|
1 NULL 1.000000
|
|
2 2 0.000000
|
|
3 NULL 1.000000
|
|
4 4 0.000000
|
|
5 NULL 1.000000
|
|
6 6 0.000000
|
|
7 NULL 1.000000
|
|
8 8 0.000000
|
|
9 NULL 1.000000
|
|
10 10 0.000000
|
|
11 NULL 1.000000
|
|
12 12 0.000000
|
|
13 NULL 1.000000
|
|
14 14 0.000000
|
|
15 NULL 1.000000
|
|
16 16 0.000000
|
|
17 NULL 1.000000
|
|
18 18 0.000000
|
|
19 NULL 0.000000
|
|
|
|
query III
|
|
SELECT r, n, mad(n) over (order by r rows between 1 preceding and 3 following)
|
|
FROM (SELECT r, CASE r % 2 WHEN 0 THEN r ELSE NULL END AS n FROM mads) nulls
|
|
ORDER BY 1
|
|
----
|
|
NULL NULL 0.000000
|
|
NULL NULL 0.000000
|
|
NULL NULL 1.000000
|
|
0 0 1.000000
|
|
1 NULL 2.000000
|
|
2 2 1.000000
|
|
3 NULL 2.000000
|
|
4 4 1.000000
|
|
5 NULL 2.000000
|
|
6 6 1.000000
|
|
7 NULL 2.000000
|
|
8 8 1.000000
|
|
9 NULL 2.000000
|
|
10 10 1.000000
|
|
11 NULL 2.000000
|
|
12 12 1.000000
|
|
13 NULL 2.000000
|
|
14 14 1.000000
|
|
15 NULL 2.000000
|
|
16 16 1.000000
|
|
17 NULL 1.000000
|
|
18 18 0.000000
|
|
19 NULL 0.000000
|
|
|
|
query III
|
|
SELECT r, n, mad(n) over (order by r rows between unbounded preceding and unbounded following)
|
|
FROM (SELECT r, CASE r % 2 WHEN 0 THEN r ELSE NULL END AS n FROM mads) nulls
|
|
ORDER BY 1
|
|
----
|
|
NULL NULL 5.000000
|
|
NULL NULL 5.000000
|
|
NULL NULL 5.000000
|
|
0 0 5.000000
|
|
1 NULL 5.000000
|
|
2 2 5.000000
|
|
3 NULL 5.000000
|
|
4 4 5.000000
|
|
5 NULL 5.000000
|
|
6 6 5.000000
|
|
7 NULL 5.000000
|
|
8 8 5.000000
|
|
9 NULL 5.000000
|
|
10 10 5.000000
|
|
11 NULL 5.000000
|
|
12 12 5.000000
|
|
13 NULL 5.000000
|
|
14 14 5.000000
|
|
15 NULL 5.000000
|
|
16 16 5.000000
|
|
17 NULL 5.000000
|
|
18 18 5.000000
|
|
19 NULL 5.000000
|
|
|
|
#
|
|
# ReplaceIndex coverage
|
|
#
|
|
statement ok
|
|
CREATE TABLE coverage AS SELECT * FROM (VALUES
|
|
(1), (2), (3), (1)
|
|
) tbl(r)
|
|
|
|
query II
|
|
SELECT r, mad(r) OVER (ORDER BY r ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
|
|
FROM coverage
|
|
ORDER BY 1
|
|
----
|
|
1 0.000000
|
|
1 0.000000
|
|
2 1.000000
|
|
3 0.500000
|
|
|
|
#
|
|
# Compare implementations
|
|
#
|
|
foreach windowmode "window" "combine" "separate"
|
|
|
|
statement ok
|
|
PRAGMA debug_window_mode=${windowmode}
|
|
|
|
query IIII
|
|
SELECT r % 2 as p, r, r/3.0, mad(r/3.0) over (partition by r % 2 order by r)
|
|
FROM mads ORDER BY 1, 2
|
|
----
|
|
NULL NULL NULL NULL
|
|
NULL NULL NULL NULL
|
|
NULL NULL NULL NULL
|
|
0 0 0.000000 0.000000
|
|
0 2 0.666667 0.333333
|
|
0 4 1.333333 0.666667
|
|
0 6 2.000000 0.666667
|
|
0 8 2.666667 0.666667
|
|
0 10 3.333333 1.000000
|
|
0 12 4.000000 1.333333
|
|
0 14 4.666667 1.333333
|
|
0 16 5.333333 1.333333
|
|
0 18 6.000000 1.666667
|
|
1 1 0.333333 0.000000
|
|
1 3 1.000000 0.333333
|
|
1 5 1.666667 0.666667
|
|
1 7 2.333333 0.666667
|
|
1 9 3.000000 0.666667
|
|
1 11 3.666667 1.000000
|
|
1 13 4.333333 1.333333
|
|
1 15 5.000000 1.333333
|
|
1 17 5.666667 1.333333
|
|
1 19 6.333333 1.666667
|
|
|
|
endloop
|