mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-23 08:02:02 +00:00
225 lines
4.7 KiB
Plaintext
225 lines
4.7 KiB
Plaintext
-- { 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
|