-- { echo } set allow_experimental_window_functions = 1; -- just something basic select number, count() over (partition by intDiv(number, 3) order by number) from numbers(10); 0 1 1 2 2 3 3 1 4 2 5 3 6 1 7 2 8 3 9 1 -- proper calculation across blocks select number, max(number) over (partition by intDiv(number, 3) order by number desc) from numbers(10) settings max_block_size = 2; 2 2 1 2 0 2 5 5 4 5 3 5 8 8 7 8 6 8 9 9 -- not a window function select number, abs(number) over (partition by toString(intDiv(number, 3))) from numbers(10); -- { serverError 63 } -- no partition by select number, avg(number) over (order by number) from numbers(10); 0 0 1 0.5 2 1 3 1.5 4 2 5 2.5 6 3 7 3.5 8 4 9 4.5 -- no order by select number, quantileExact(number) over (partition by intDiv(number, 3)) from numbers(10); 0 0 1 1 2 1 3 3 4 4 5 4 6 6 7 7 8 7 9 9 -- can add an alias after window spec select number, quantileExact(number) over (partition by intDiv(number, 3)) q from numbers(10); 0 0 1 1 2 1 3 3 4 4 5 4 6 6 7 7 8 7 9 9 -- can't reference it yet -- the window functions are calculated at the -- last stage of select, after all other functions. select q * 10, quantileExact(number) over (partition by intDiv(number, 3)) q from numbers(10); -- { serverError 47 } -- must work in WHERE if you wrap it in a subquery select * from (select count(*) over () c from numbers(3)) where c > 0; 1 2 3 -- should work in ORDER BY select number, max(number) over (partition by intDiv(number, 3) order by number desc) m from numbers(10) order by m desc, number; 9 9 6 8 7 8 8 8 3 5 4 5 5 5 0 2 1 2 2 2 -- also works in ORDER BY if you wrap it in a subquery select * from (select count(*) over () c from numbers(3)) order by c; 1 2 3 -- Example with window function only in ORDER BY. Here we make a rank of all -- numbers sorted descending, and then sort by this rank descending, and must get -- the ascending order. select * from (select * from numbers(5) order by rand()) order by count() over (order by number desc) desc; 0 1 2 3 4 -- Aggregate functions as window function arguments. This query is semantically -- the same as the above one, only we replace `number` with -- `any(number) group by number` and so on. select * from (select * from numbers(5) order by rand()) group by number order by sum(any(number + 1)) over (order by min(number) desc) desc; 0 1 2 3 4 -- some more simple cases w/aggregate functions select sum(any(number)) over () from numbers(1); 0 select sum(any(number) + 1) over () from numbers(1); 1 select sum(any(number + 1)) over () from numbers(1); 1 -- different windows -- an explain test would also be helpful, but it's too immature now and I don't -- want to change reference all the time select number, max(number) over (partition by intDiv(number, 3) order by number desc), count(number) over (partition by intDiv(number, 5) order by number) as m from numbers(31) order by number settings max_block_size = 2; 0 2 1 1 2 2 2 2 3 3 5 4 4 5 5 5 5 1 6 8 2 7 8 3 8 8 4 9 11 5 10 11 1 11 11 2 12 14 3 13 14 4 14 14 5 15 17 1 16 17 2 17 17 3 18 20 4 19 20 5 20 20 1 21 23 2 22 23 3 23 23 4 24 26 5 25 26 1 26 26 2 27 29 3 28 29 4 29 29 5 30 30 1 -- two functions over the same window -- an explain test would also be helpful, but it's too immature now and I don't -- want to change reference all the time select number, max(number) over (partition by intDiv(number, 3) order by number desc), count(number) over (partition by intDiv(number, 3) order by number desc) as m from numbers(7) order by number settings max_block_size = 2; 0 2 3 1 2 2 2 2 1 3 5 3 4 5 2 5 5 1 6 6 1 -- check that we can work with constant columns select median(x) over (partition by x) from (select 1 x); 1 -- an empty window definition is valid as well select groupArray(number) over () from numbers(3); [0] [0,1] [0,1,2] -- This one tests we properly process the window function arguments. -- Seen errors like 'column `1` not found' from count(1). select count(1) over (), max(number + 1) over () from numbers(3); 1 3 -- Should work in DISTINCT select distinct sum(0) over () from numbers(2); 0 select distinct any(number) over () from numbers(2); 0 -- Various kinds of aliases are properly substituted into various parts of window -- function definition. with number + 1 as x select intDiv(number, 3) as y, sum(x + y) over (partition by y order by x) from numbers(7); 0 1 0 3 0 6 1 5 1 11 1 18 2 9 -- WINDOW clause select 1 window w1 as (); 1 select sum(number) over w1, sum(number) over w2 from numbers(10) window w1 as (), w2 as (partition by intDiv(number, 3)) ; 0 0 1 1 3 3 6 3 10 7 15 12 21 6 28 13 36 21 45 9 select sum(number) over w1, sum(number) over (partition by intDiv(number, 3)) from numbers(10) window w1 as (partition by intDiv(number, 3)) ; 0 0 1 1 3 3 3 3 7 7 12 12 6 6 13 13 21 21 9 9