# 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