178 lines
2.7 KiB
SQL
178 lines
2.7 KiB
SQL
# name: test/sql/window/test_mode_window.test
|
|
# description: Test MODE aggregate as a window function
|
|
# group: [window]
|
|
|
|
statement ok
|
|
SET default_null_order='nulls_first';
|
|
|
|
statement ok
|
|
PRAGMA enable_verification
|
|
|
|
statement ok
|
|
PRAGMA verify_external
|
|
|
|
statement ok
|
|
create table modes as select range r from range(10) union all values (NULL), (NULL), (NULL);
|
|
|
|
query IIII
|
|
SELECT r % 2, r, r//3, mode(r//3) over (partition by r % 2 order by r) FROM modes ORDER BY 1, 2
|
|
----
|
|
NULL NULL NULL NULL
|
|
NULL NULL NULL NULL
|
|
NULL NULL NULL NULL
|
|
0 0 0 0
|
|
0 2 0 0
|
|
0 4 1 0
|
|
0 6 2 0
|
|
0 8 2 0
|
|
1 1 0 0
|
|
1 3 1 0
|
|
1 5 1 1
|
|
1 7 2 1
|
|
1 9 3 1
|
|
|
|
query III
|
|
SELECT r, r//3, mode(r//3) over (order by r rows between 1 preceding and 1 following)
|
|
FROM modes
|
|
ORDER BY ALL
|
|
----
|
|
NULL NULL NULL
|
|
NULL NULL NULL
|
|
NULL NULL 0
|
|
0 0 0
|
|
1 0 0
|
|
2 0 0
|
|
3 1 1
|
|
4 1 1
|
|
5 1 1
|
|
6 2 2
|
|
7 2 2
|
|
8 2 2
|
|
9 3 2
|
|
|
|
query III
|
|
SELECT r, r//3, mode(r//3) over (order by r rows between 1 preceding and 3 following) FROM modes ORDER BY 1, 2
|
|
----
|
|
NULL NULL 0
|
|
NULL NULL 0
|
|
NULL NULL 0
|
|
0 0 0
|
|
1 0 0
|
|
2 0 1
|
|
3 1 1
|
|
4 1 1
|
|
5 1 2
|
|
6 2 2
|
|
7 2 2
|
|
8 2 2
|
|
9 3 2
|
|
|
|
# Scattered NULLs
|
|
query IIII
|
|
SELECT r, r // 3, n, mode(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 modes) nulls
|
|
ORDER BY 1
|
|
----
|
|
NULL NULL NULL NULL
|
|
NULL NULL NULL NULL
|
|
NULL NULL NULL NULL
|
|
0 0 0 0
|
|
1 0 NULL NULL
|
|
2 0 2 2
|
|
3 1 NULL 0
|
|
4 1 4 4
|
|
5 1 NULL 2
|
|
6 2 6 0
|
|
7 2 NULL 4
|
|
8 2 8 2
|
|
9 3 NULL 0
|
|
|
|
query III
|
|
SELECT r, n, mode(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 modes) nulls
|
|
ORDER BY ALL
|
|
----
|
|
NULL NULL NULL
|
|
NULL NULL NULL
|
|
NULL NULL 0
|
|
0 0 0
|
|
1 NULL 0
|
|
2 2 2
|
|
3 NULL 2
|
|
4 4 4
|
|
5 NULL 4
|
|
6 6 6
|
|
7 NULL 6
|
|
8 8 8
|
|
9 NULL 8
|
|
|
|
query III
|
|
SELECT r, n, mode(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 modes) nulls
|
|
ORDER BY 1
|
|
----
|
|
NULL NULL 0
|
|
NULL NULL 0
|
|
NULL NULL 0
|
|
0 0 0
|
|
1 NULL 0
|
|
2 2 2
|
|
3 NULL 2
|
|
4 4 4
|
|
5 NULL 4
|
|
6 6 6
|
|
7 NULL 6
|
|
8 8 8
|
|
9 NULL 8
|
|
|
|
query III
|
|
SELECT r, n, mode(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 modes) nulls
|
|
ORDER BY 1
|
|
----
|
|
NULL NULL 0
|
|
NULL NULL 0
|
|
NULL NULL 0
|
|
0 0 0
|
|
1 NULL 0
|
|
2 2 0
|
|
3 NULL 0
|
|
4 4 0
|
|
5 NULL 0
|
|
6 6 0
|
|
7 NULL 0
|
|
8 8 0
|
|
9 NULL 0
|
|
|
|
#
|
|
# Compare implementations
|
|
#
|
|
|
|
foreach windowmode "window" "combine" "separate"
|
|
|
|
statement ok
|
|
PRAGMA debug_window_mode=${windowmode}
|
|
|
|
query III
|
|
WITH t(r) AS (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (NULL), (NULL), (NULL))
|
|
SELECT r, r//3, mode(r//3) over (order by r rows between 1 preceding and 1 following)
|
|
FROM t
|
|
ORDER BY ALL
|
|
----
|
|
NULL NULL NULL
|
|
NULL NULL NULL
|
|
NULL NULL 0
|
|
0 0 0
|
|
1 0 0
|
|
2 0 0
|
|
3 1 1
|
|
4 1 1
|
|
5 1 1
|
|
6 2 2
|
|
7 2 2
|
|
8 2 2
|
|
9 3 2
|
|
|
|
endloop
|
|
|