set allow_experimental_window_functions = 1; -- just something basic select number, count() over (partition by intDiv(number, 3) order by number) from numbers(10); -- proper calculation across blocks 0 1 1 2 2 3 3 1 4 2 5 3 6 1 7 2 8 3 9 1 select number, max(number) over (partition by intDiv(number, 3) order by number desc) from numbers(10) settings max_block_size = 2; -- not a window function 2 2 1 2 0 2 5 5 4 5 3 5 8 8 7 8 6 8 9 9 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); -- no order by 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 select number, quantileExact(number) over (partition by intDiv(number, 3)) from numbers(10); -- can add an alias after window spec 0 0 1 1 2 1 3 3 4 4 5 4 6 6 7 7 8 7 9 9 select number, quantileExact(number) over (partition by intDiv(number, 3)) q from numbers(10); -- can't reference it yet -- the window functions are calculated at the -- last stage of select, after all other functions. 0 0 1 1 2 1 3 3 4 4 5 4 6 6 7 7 8 7 9 9 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; -- should work in ORDER BY 1 2 3 select number, max(number) over (partition by intDiv(number, 3) order by number desc) m from numbers(10) order by m desc, number; -- also works in ORDER BY if you wrap it in a subquery 9 9 6 8 7 8 8 8 3 5 4 5 5 5 0 2 1 2 2 2 select * from (select count(*) over () c from numbers(3)) order by c; -- 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. 1 2 3 select * from (select * from numbers(5) order by rand()) order by count() over (order by number desc) desc; -- 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. 0 1 2 3 4 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; -- 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 0 1 2 3 4 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; -- 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 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 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; -- check that we can work with constant columns 0 2 3 1 2 2 2 2 1 3 5 3 4 5 2 5 5 1 6 6 1 select median(x) over (partition by x) from (select 1 x); -- an empty window definition is valid as well 1 select groupArray(number) over () from numbers(3); -- This one tests we properly process the window function arguments. -- Seen errors like 'column `1` not found' from count(1). [0] [0,1] [0,1,2] select count(1) over (), max(number + 1) over () from numbers(3); -- Should work in DISTINCT 1 3 select distinct sum(0) over () from numbers(2); 0 select distinct any(number) over () from numbers(2); -- Various kinds of aliases are properly substituted into various parts of window -- function definition. 0 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