2016-05-08 22:04:41 +02:00
|
|
|
#
|
|
|
|
# Window Functions Tests
|
|
|
|
#
|
|
|
|
|
|
|
|
--disable_warnings
|
|
|
|
drop table if exists t1,t2;
|
|
|
|
drop view if exists v1;
|
|
|
|
--enable_warnings
|
|
|
|
|
|
|
|
--echo # ########################################################################
|
|
|
|
--echo # # Parser tests
|
|
|
|
--echo # ########################################################################
|
|
|
|
--echo #
|
2016-09-22 18:22:34 +02:00
|
|
|
--echo # Check what happens when one attempts to use window function without OVER clause
|
2016-05-08 22:04:41 +02:00
|
|
|
create table t1 (a int, b int);
|
|
|
|
insert into t1 values (1,1),(2,2);
|
|
|
|
|
|
|
|
--error ER_PARSE_ERROR
|
|
|
|
select row_number() from t1;
|
|
|
|
--error ER_PARSE_ERROR
|
|
|
|
select rank() from t1;
|
|
|
|
|
|
|
|
--echo # Attempt to use window function in the WHERE clause
|
2016-09-22 18:22:34 +02:00
|
|
|
--error ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION
|
2016-05-08 22:04:41 +02:00
|
|
|
select * from t1 where 1=rank() over (order by a);
|
|
|
|
--error ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION
|
|
|
|
select * from t1 where 1>row_number() over (partition by b order by a);
|
|
|
|
drop table t1;
|
|
|
|
|
|
|
|
--echo # ########################################################################
|
|
|
|
--echo # # Functionality tests
|
|
|
|
--echo # ########################################################################
|
|
|
|
--echo #
|
|
|
|
--echo # Check if ROW_NUMBER() works in basic cases
|
|
|
|
create table t1(a int, b int, x char(32));
|
|
|
|
insert into t1 values (2, 10, 'xx');
|
|
|
|
insert into t1 values (2, 10, 'zz');
|
|
|
|
insert into t1 values (2, 20, 'yy');
|
|
|
|
insert into t1 values (3, 10, 'xxx');
|
|
|
|
insert into t1 values (3, 20, 'vvv');
|
|
|
|
|
|
|
|
--sorted_result
|
|
|
|
select a, row_number() over (partition by a order by b) from t1;
|
|
|
|
|
|
|
|
select a, b, x, row_number() over (partition by a order by x) from t1;
|
|
|
|
|
|
|
|
drop table t1;
|
|
|
|
|
|
|
|
create table t1 (pk int primary key, a int, b int);
|
2016-09-22 18:22:34 +02:00
|
|
|
insert into t1 values
|
2016-05-08 22:04:41 +02:00
|
|
|
(1, 10, 22),
|
|
|
|
(2, 11, 21),
|
|
|
|
(3, 12, 20),
|
|
|
|
(4, 13, 19),
|
|
|
|
(5, 14, 18);
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, a, b,
|
|
|
|
row_number() over (order by a),
|
2016-05-08 22:04:41 +02:00
|
|
|
row_number() over (order by b)
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
drop table t1;
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # Try RANK() function
|
|
|
|
--echo #
|
|
|
|
create table t2 (
|
2016-09-22 18:22:34 +02:00
|
|
|
pk int primary key,
|
2016-05-08 22:04:41 +02:00
|
|
|
a int
|
|
|
|
);
|
|
|
|
|
|
|
|
insert into t2 values
|
|
|
|
( 1 , 0),
|
|
|
|
( 2 , 0),
|
|
|
|
( 3 , 1),
|
|
|
|
( 4 , 1),
|
|
|
|
( 8 , 2),
|
|
|
|
( 5 , 2),
|
|
|
|
( 6 , 2),
|
|
|
|
( 7 , 2),
|
|
|
|
( 9 , 4),
|
|
|
|
(10 , 4);
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
--sorted_result
|
2016-05-08 22:04:41 +02:00
|
|
|
select pk, a, rank() over (order by a) from t2;
|
2016-09-22 18:22:34 +02:00
|
|
|
--sorted_result
|
2016-05-08 22:04:41 +02:00
|
|
|
select pk, a, rank() over (order by a desc) from t2;
|
|
|
|
|
|
|
|
drop table t2;
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # Try Aggregates as window functions. With frames.
|
|
|
|
--echo #
|
|
|
|
create table t0 (a int);
|
|
|
|
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
|
|
|
|
|
|
|
create table t1 (pk int, c int);
|
|
|
|
insert into t1 select a+1,1 from t0;
|
|
|
|
update t1 set c=2 where pk not in (1,2,3,4);
|
|
|
|
select * from t1;
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
|
|
|
count(*) over (partition by c order by pk
|
2016-05-08 22:04:41 +02:00
|
|
|
rows between 2 preceding and 2 following) as CNT
|
|
|
|
from t1;
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
|
|
|
count(*) over (partition by c order by pk
|
2016-05-08 22:04:41 +02:00
|
|
|
rows between 1 preceding and 2 following) as CNT
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
select
|
2016-09-22 18:22:34 +02:00
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over (partition by c order by pk
|
2016-09-22 18:22:34 +02:00
|
|
|
rows between 2 preceding and current row) as CNT
|
2016-05-08 22:04:41 +02:00
|
|
|
from t1;
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk,c,
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over (partition by c order by pk rows
|
|
|
|
between 1 following and 2 following) as CNT
|
|
|
|
from t1;
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk,c,
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over (partition by c order by pk rows
|
|
|
|
between 2 preceding and 1 preceding) as CNT
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
select
|
2016-09-22 18:22:34 +02:00
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over (partition by c order by pk
|
2016-09-22 18:22:34 +02:00
|
|
|
rows between current row and 1 following) as CNT
|
2016-05-08 22:04:41 +02:00
|
|
|
from t1;
|
|
|
|
|
|
|
|
--echo # Check ORDER BY DESC
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over (partition by c order by pk desc
|
|
|
|
rows between 2 preceding and 2 following) as CNT
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
drop table t0,t1;
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # Resolution of window names
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
create table t0 (a int);
|
|
|
|
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
|
|
|
|
|
|
|
create table t1 (pk int, c int);
|
|
|
|
insert into t1 select a+1,1 from t0;
|
|
|
|
update t1 set c=2 where pk not in (1,2,3,4);
|
|
|
|
select * from t1;
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
2016-05-08 22:04:41 +02:00
|
|
|
pk, c,
|
|
|
|
count(*) over w1 as CNT
|
|
|
|
from t1
|
2016-09-22 18:22:34 +02:00
|
|
|
window w1 as (partition by c order by pk
|
2016-05-08 22:04:41 +02:00
|
|
|
rows between 2 preceding and 2 following);
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over (w1 rows between 2 preceding and 2 following) as CNT
|
|
|
|
from t1
|
|
|
|
window w1 as (partition by c order by pk);
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over (w1 order by pk rows between 2 preceding and 2 following) as CNT
|
|
|
|
from t1
|
|
|
|
window w1 as (partition by c);
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over (w2 rows between 2 preceding and 2 following) as CNT
|
|
|
|
from t1
|
|
|
|
window w1 as (partition by c), w2 as (w1 order by pk);
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over w3 as CNT
|
|
|
|
from t1
|
|
|
|
window
|
2016-09-22 18:22:34 +02:00
|
|
|
w1 as (partition by c),
|
2016-05-08 22:04:41 +02:00
|
|
|
w2 as (w1 order by pk),
|
|
|
|
w3 as (w2 rows between 2 preceding and 2 following);
|
|
|
|
|
|
|
|
--error ER_WRONG_WINDOW_SPEC_NAME
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over w as CNT
|
|
|
|
from t1
|
2016-09-22 18:22:34 +02:00
|
|
|
window w1 as (partition by c order by pk
|
2016-05-08 22:04:41 +02:00
|
|
|
rows between 2 preceding and 2 following);
|
|
|
|
|
|
|
|
--error ER_DUP_WINDOW_NAME
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over (w2 rows between 2 preceding and 2 following) as CNT
|
|
|
|
from t1
|
|
|
|
window w1 as (partition by c), w1 as (order by pk);
|
|
|
|
|
|
|
|
--error ER_WRONG_WINDOW_SPEC_NAME
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over (w2 rows between 2 preceding and 2 following) as CNT
|
|
|
|
from t1
|
|
|
|
window w1 as (partition by c), w2 as (w partition by c order by pk);
|
|
|
|
|
|
|
|
--error ER_PARTITION_LIST_IN_REFERENCING_WINDOW_SPEC
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over (w2 rows between 2 preceding and 2 following) as CNT
|
|
|
|
from t1
|
|
|
|
window w1 as (partition by c), w2 as (w1 partition by c order by pk);
|
|
|
|
|
|
|
|
--error ER_ORDER_LIST_IN_REFERENCING_WINDOW_SPEC
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over (w2 rows between 2 preceding and 2 following) as CNT
|
|
|
|
from t1
|
|
|
|
window w1 as (partition by c order by pk), w2 as (w1 order by pk);
|
|
|
|
|
|
|
|
--error ER_WINDOW_FRAME_IN_REFERENCED_WINDOW_SPEC
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over w3 as CNT
|
|
|
|
from t1
|
|
|
|
window
|
2016-09-22 18:22:34 +02:00
|
|
|
w1 as (partition by c),
|
2016-05-08 22:04:41 +02:00
|
|
|
w2 as (w1 order by pk rows between 3 preceding and 2 following),
|
|
|
|
w3 as (w2 rows between 2 preceding and 2 following);
|
|
|
|
|
|
|
|
--error ER_BAD_COMBINATION_OF_WINDOW_FRAME_BOUND_SPECS
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over w1 as CNT
|
|
|
|
from t1
|
2016-09-22 18:22:34 +02:00
|
|
|
window w1 as (partition by c order by pk
|
2016-05-08 22:04:41 +02:00
|
|
|
rows between unbounded following and 2 following);
|
|
|
|
|
|
|
|
--error ER_BAD_COMBINATION_OF_WINDOW_FRAME_BOUND_SPECS
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over (w1 rows between 2 preceding and unbounded preceding) as CNT
|
|
|
|
from t1
|
|
|
|
window w1 as (partition by c order by pk);
|
|
|
|
|
|
|
|
--error ER_BAD_COMBINATION_OF_WINDOW_FRAME_BOUND_SPECS
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over (w1 order by pk rows between current row and 2 preceding) as CNT
|
|
|
|
from t1
|
|
|
|
window w1 as (partition by c);
|
|
|
|
|
|
|
|
--error ER_BAD_COMBINATION_OF_WINDOW_FRAME_BOUND_SPECS
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over (w2 rows between 2 following and current row) as CNT
|
|
|
|
from t1
|
|
|
|
window w1 as (partition by c), w2 as (w1 order by pk);
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
--error ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION
|
|
|
|
select
|
|
|
|
pk, c
|
2016-05-08 22:04:41 +02:00
|
|
|
from t1 where rank() over w1 > 2
|
|
|
|
window w1 as (partition by c order by pk);
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
--error ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION
|
2016-05-08 22:04:41 +02:00
|
|
|
select
|
|
|
|
c, max(pk) as m
|
2016-09-22 18:22:34 +02:00
|
|
|
from t1
|
2016-05-08 22:04:41 +02:00
|
|
|
group by c + rank() over w1
|
|
|
|
window w1 as (order by m);
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
--error ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION
|
2016-05-08 22:04:41 +02:00
|
|
|
select
|
2016-09-22 18:22:34 +02:00
|
|
|
c, max(pk) as m, rank() over w1 as r
|
|
|
|
from t1
|
2016-05-08 22:04:41 +02:00
|
|
|
group by c+r
|
|
|
|
window w1 as (order by m);
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
--error ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION
|
2016-05-08 22:04:41 +02:00
|
|
|
select
|
|
|
|
c, max(pk) as m, rank() over w1 as r
|
2016-09-22 18:22:34 +02:00
|
|
|
from t1
|
2016-05-08 22:04:41 +02:00
|
|
|
group by c having c+r > 3
|
|
|
|
window w1 as (order by m);
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
--error ER_WINDOW_FUNCTION_IN_WINDOW_SPEC
|
2016-05-08 22:04:41 +02:00
|
|
|
select
|
2016-09-22 18:22:34 +02:00
|
|
|
c, max(pk) as m, rank() over w1 as r,
|
|
|
|
rank() over (partition by r+1 order by m)
|
|
|
|
from t1
|
2016-05-08 22:04:41 +02:00
|
|
|
group by c
|
|
|
|
window w1 as (order by m);
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
--error ER_WINDOW_FUNCTION_IN_WINDOW_SPEC
|
2016-05-08 22:04:41 +02:00
|
|
|
select
|
2016-09-22 18:22:34 +02:00
|
|
|
c, max(pk) as m, rank() over w1 as r,
|
|
|
|
rank() over (partition by m order by r)
|
|
|
|
from t1
|
2016-05-08 22:04:41 +02:00
|
|
|
group by c
|
|
|
|
window w1 as (order by m);
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
--error ER_WINDOW_FUNCTION_IN_WINDOW_SPEC
|
2016-05-08 22:04:41 +02:00
|
|
|
select
|
2016-09-22 18:22:34 +02:00
|
|
|
c, max(pk) as m, rank() over w1 as r, dense_rank() over w2 as dr
|
|
|
|
from t1
|
2016-05-08 22:04:41 +02:00
|
|
|
group by c
|
|
|
|
window w1 as (order by m), w2 as (partition by r order by m);
|
|
|
|
|
|
|
|
--error ER_NOT_ALLOWED_WINDOW_FRAME
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
|
|
|
row_number() over (partition by c order by pk
|
|
|
|
range between unbounded preceding and current row) as r
|
2016-05-08 22:04:41 +02:00
|
|
|
from t1;
|
|
|
|
|
|
|
|
--error ER_NOT_ALLOWED_WINDOW_FRAME
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
rank() over w1 as r
|
|
|
|
from t1
|
2016-09-22 18:22:34 +02:00
|
|
|
window w1 as (partition by c order by pk
|
2016-05-08 22:04:41 +02:00
|
|
|
rows between 2 preceding and 2 following);
|
|
|
|
|
|
|
|
--error ER_NOT_ALLOWED_WINDOW_FRAME
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
dense_rank() over (partition by c order by pk
|
|
|
|
rows between 1 preceding and 1 following) as r
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
--error ER_NO_ORDER_LIST_IN_WINDOW_SPEC
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
rank() over w1 as r
|
|
|
|
from t1
|
|
|
|
window w1 as (partition by c);
|
|
|
|
|
|
|
|
--error ER_NO_ORDER_LIST_IN_WINDOW_SPEC
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
dense_rank() over (partition by c) as r
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
drop table t0,t1;
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # MDEV-9634: Window function produces incorrect value
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
create table t0 (a int);
|
|
|
|
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
|
|
|
create table t2 (part_id int, pk int, a int);
|
2016-09-22 18:22:34 +02:00
|
|
|
insert into t2 select
|
2016-05-08 22:04:41 +02:00
|
|
|
if(a<5, 0, 1), a, if(a<5, NULL, 1) from t0;
|
|
|
|
select * from t2;
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
2016-05-08 22:04:41 +02:00
|
|
|
part_id, pk, a,
|
|
|
|
count(a) over (partition by part_id order by pk
|
|
|
|
rows between 1 preceding and 1 following) as CNT
|
|
|
|
from t2;
|
|
|
|
|
|
|
|
drop table t0, t2;
|
|
|
|
|
|
|
|
--echo #
|
2016-09-22 18:22:34 +02:00
|
|
|
--echo # RANGE-type bounds
|
2016-05-08 22:04:41 +02:00
|
|
|
--echo #
|
|
|
|
|
|
|
|
create table t3 (
|
2016-09-22 18:22:34 +02:00
|
|
|
pk int,
|
2016-05-08 22:04:41 +02:00
|
|
|
val int
|
|
|
|
);
|
|
|
|
|
|
|
|
insert into t3 values
|
|
|
|
(0, 1),
|
|
|
|
(1, 1),
|
|
|
|
(2, 1),
|
|
|
|
(3, 2),
|
|
|
|
(4, 2),
|
|
|
|
(5, 2),
|
|
|
|
(6, 2);
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk,
|
2016-05-08 22:04:41 +02:00
|
|
|
val,
|
2016-09-22 18:22:34 +02:00
|
|
|
count(val) over (order by val
|
|
|
|
range between current row and
|
|
|
|
current row)
|
2016-05-08 22:04:41 +02:00
|
|
|
as CNT
|
|
|
|
from t3;
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
insert into t3 values
|
2016-05-08 22:04:41 +02:00
|
|
|
(7, 3),
|
|
|
|
(8, 3);
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk,
|
2016-05-08 22:04:41 +02:00
|
|
|
val,
|
2016-09-22 18:22:34 +02:00
|
|
|
count(val) over (order by val
|
|
|
|
range between current row and
|
|
|
|
current row)
|
2016-05-08 22:04:41 +02:00
|
|
|
as CNT
|
|
|
|
from t3;
|
|
|
|
|
|
|
|
drop table t3;
|
|
|
|
|
|
|
|
--echo # Now, check with PARTITION BY
|
|
|
|
create table t4 (
|
|
|
|
part_id int,
|
|
|
|
pk int,
|
|
|
|
val int
|
|
|
|
);
|
|
|
|
|
|
|
|
insert into t4 values
|
|
|
|
(1234, 100, 1),
|
|
|
|
(1234, 101, 1),
|
|
|
|
(1234, 102, 1),
|
|
|
|
(1234, 103, 2),
|
|
|
|
(1234, 104, 2),
|
|
|
|
(1234, 105, 2),
|
|
|
|
(1234, 106, 2),
|
|
|
|
(1234, 107, 3),
|
|
|
|
(1234, 108, 3),
|
|
|
|
|
|
|
|
(5678, 200, 1),
|
|
|
|
(5678, 201, 1),
|
|
|
|
(5678, 202, 1),
|
|
|
|
(5678, 203, 2),
|
|
|
|
(5678, 204, 2),
|
|
|
|
(5678, 205, 2),
|
|
|
|
(5678, 206, 2),
|
|
|
|
(5678, 207, 3),
|
|
|
|
(5678, 208, 3);
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
2016-05-08 22:04:41 +02:00
|
|
|
part_id,
|
2016-09-22 18:22:34 +02:00
|
|
|
pk,
|
2016-05-08 22:04:41 +02:00
|
|
|
val,
|
|
|
|
count(val) over (partition by part_id
|
2016-09-22 18:22:34 +02:00
|
|
|
order by val
|
|
|
|
range between current row and
|
|
|
|
current row)
|
2016-05-08 22:04:41 +02:00
|
|
|
as CNT
|
|
|
|
from t4;
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # Try RANGE UNBOUNDED PRECEDING | FOLLOWING
|
|
|
|
--echo #
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
2016-05-08 22:04:41 +02:00
|
|
|
part_id,
|
2016-09-22 18:22:34 +02:00
|
|
|
pk,
|
2016-05-08 22:04:41 +02:00
|
|
|
val,
|
|
|
|
count(val) over (partition by part_id
|
2016-09-22 18:22:34 +02:00
|
|
|
order by val
|
|
|
|
range between unbounded preceding and
|
|
|
|
current row)
|
2016-05-08 22:04:41 +02:00
|
|
|
as CNT
|
|
|
|
from t4;
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
2016-05-08 22:04:41 +02:00
|
|
|
part_id,
|
2016-09-22 18:22:34 +02:00
|
|
|
pk,
|
2016-05-08 22:04:41 +02:00
|
|
|
val,
|
|
|
|
count(val) over (partition by part_id
|
2016-09-22 18:22:34 +02:00
|
|
|
order by val
|
|
|
|
range between current row and
|
|
|
|
unbounded following)
|
2016-05-08 22:04:41 +02:00
|
|
|
as CNT
|
|
|
|
from t4;
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
2016-05-08 22:04:41 +02:00
|
|
|
part_id,
|
2016-09-22 18:22:34 +02:00
|
|
|
pk,
|
2016-05-08 22:04:41 +02:00
|
|
|
val,
|
|
|
|
count(val) over (partition by part_id
|
2016-09-22 18:22:34 +02:00
|
|
|
order by val
|
|
|
|
range between unbounded preceding and
|
|
|
|
unbounded following)
|
2016-05-08 22:04:41 +02:00
|
|
|
as CNT
|
|
|
|
from t4;
|
|
|
|
|
|
|
|
drop table t4;
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # MDEV-9695: Wrong window frame when using RANGE BETWEEN N FOLLOWING AND PRECEDING
|
|
|
|
--echo #
|
|
|
|
create table t1 (pk int, a int, b int);
|
|
|
|
insert into t1 values
|
|
|
|
( 1 , 0, 1),
|
|
|
|
( 2 , 0, 2),
|
|
|
|
( 3 , 1, 4),
|
|
|
|
( 4 , 1, 8),
|
|
|
|
( 5 , 2, 32),
|
|
|
|
( 6 , 2, 64),
|
|
|
|
( 7 , 2, 128),
|
|
|
|
( 8 , 2, 16);
|
2016-09-22 18:22:34 +02:00
|
|
|
|
2016-05-08 22:04:41 +02:00
|
|
|
select pk, a, b,
|
|
|
|
bit_or(b) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) as bit_or
|
|
|
|
from t1;
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
--echo # Extra ROWS n PRECEDING tests
|
2016-05-08 22:04:41 +02:00
|
|
|
select pk, a, b,
|
|
|
|
bit_or(b) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) as bit_or
|
|
|
|
from t1;
|
|
|
|
drop table t1;
|
|
|
|
|
|
|
|
|
|
|
|
create table t2 (
|
2016-09-22 18:22:34 +02:00
|
|
|
pk int,
|
|
|
|
a int,
|
2016-05-08 22:04:41 +02:00
|
|
|
b int
|
|
|
|
);
|
|
|
|
|
|
|
|
insert into t2 values
|
|
|
|
( 1, 0, 1),
|
|
|
|
( 2, 0, 2),
|
|
|
|
( 3, 0, 4),
|
|
|
|
( 4, 0, 8),
|
|
|
|
( 5, 1, 16),
|
|
|
|
( 6, 1, 32),
|
|
|
|
( 7, 1, 64),
|
|
|
|
( 8, 1, 128),
|
|
|
|
( 9, 2, 256),
|
|
|
|
(10, 2, 512),
|
|
|
|
(11, 2, 1024),
|
|
|
|
(12, 2, 2048);
|
|
|
|
|
|
|
|
select pk, a, b,
|
|
|
|
bit_or(b) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) as bit_or
|
|
|
|
from t2;
|
|
|
|
|
|
|
|
select pk, a, b,
|
|
|
|
bit_or(b) over (partition by a order by pk ROWS BETWEEN 2 PRECEDING AND 2 PRECEDING) as bit_or
|
|
|
|
from t2;
|
|
|
|
|
|
|
|
select pk, a, b,
|
|
|
|
bit_or(b) over (partition by a order by pk ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING) as bit_or
|
|
|
|
from t2;
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
--echo # Check CURRENT ROW
|
2016-05-08 22:04:41 +02:00
|
|
|
|
|
|
|
select pk, a, b,
|
|
|
|
bit_or(b) over (partition by a order by pk ROWS BETWEEN CURRENT ROW AND CURRENT ROW) as bit_or
|
|
|
|
from t2;
|
|
|
|
|
|
|
|
drop table t2;
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # Try RANGE PRECEDING|FOLLWING n
|
|
|
|
--echo #
|
|
|
|
create table t1 (
|
|
|
|
part_id int,
|
|
|
|
pk int,
|
|
|
|
a int
|
|
|
|
);
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
insert into t1 values
|
2016-05-08 22:04:41 +02:00
|
|
|
(10, 1, 1),
|
|
|
|
(10, 2, 2),
|
|
|
|
(10, 3, 4),
|
|
|
|
(10, 4, 8),
|
2016-09-22 18:22:34 +02:00
|
|
|
(10, 5,26),
|
2016-05-08 22:04:41 +02:00
|
|
|
(10, 6,27),
|
|
|
|
(10, 7,40),
|
|
|
|
(10, 8,71),
|
|
|
|
(10, 9,72);
|
|
|
|
|
|
|
|
select
|
|
|
|
pk, a,
|
|
|
|
count(a) over (ORDER BY a
|
2016-09-22 18:22:34 +02:00
|
|
|
RANGE BETWEEN UNBOUNDED PRECEDING
|
2016-05-08 22:04:41 +02:00
|
|
|
AND 10 FOLLOWING) as cnt
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
select
|
|
|
|
pk, a,
|
|
|
|
count(a) over (ORDER BY a DESC
|
2016-09-22 18:22:34 +02:00
|
|
|
RANGE BETWEEN UNBOUNDED PRECEDING
|
2016-05-08 22:04:41 +02:00
|
|
|
AND 10 FOLLOWING) as cnt
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
select
|
|
|
|
pk, a,
|
|
|
|
count(a) over (ORDER BY a
|
2016-09-22 18:22:34 +02:00
|
|
|
RANGE BETWEEN UNBOUNDED PRECEDING
|
2016-05-08 22:04:41 +02:00
|
|
|
AND 1 FOLLOWING) as cnt
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
select
|
|
|
|
pk, a,
|
|
|
|
count(a) over (ORDER BY a
|
2016-09-22 18:22:34 +02:00
|
|
|
RANGE BETWEEN UNBOUNDED PRECEDING
|
2016-05-08 22:04:41 +02:00
|
|
|
AND 10 PRECEDING) as cnt
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
select
|
|
|
|
pk, a,
|
|
|
|
count(a) over (ORDER BY a DESC
|
2016-09-22 18:22:34 +02:00
|
|
|
RANGE BETWEEN UNBOUNDED PRECEDING
|
2016-05-08 22:04:41 +02:00
|
|
|
AND 10 PRECEDING) as cnt
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
select
|
|
|
|
pk, a,
|
|
|
|
count(a) over (ORDER BY a
|
2016-09-22 18:22:34 +02:00
|
|
|
RANGE BETWEEN UNBOUNDED PRECEDING
|
2016-05-08 22:04:41 +02:00
|
|
|
AND 1 PRECEDING) as cnt
|
|
|
|
from t1;
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
# Try bottom bound
|
2016-05-08 22:04:41 +02:00
|
|
|
select
|
|
|
|
pk, a,
|
|
|
|
count(a) over (ORDER BY a
|
2016-09-22 18:22:34 +02:00
|
|
|
RANGE BETWEEN 1 PRECEDING
|
2016-05-08 22:04:41 +02:00
|
|
|
AND CURRENT ROW) as cnt
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
select
|
|
|
|
pk, a,
|
|
|
|
count(a) over (ORDER BY a DESC
|
2016-09-22 18:22:34 +02:00
|
|
|
RANGE BETWEEN 1 PRECEDING
|
2016-05-08 22:04:41 +02:00
|
|
|
AND CURRENT ROW) as cnt
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
select
|
|
|
|
pk, a,
|
|
|
|
count(a) over (ORDER BY a
|
2016-09-22 18:22:34 +02:00
|
|
|
RANGE BETWEEN 1 FOLLOWING
|
2016-05-08 22:04:41 +02:00
|
|
|
AND 3 FOLLOWING) as cnt
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
--echo # Try CURRENT ROW with[out] DESC
|
|
|
|
select
|
|
|
|
pk, a,
|
|
|
|
count(a) over (ORDER BY a
|
|
|
|
RANGE BETWEEN CURRENT ROW
|
|
|
|
AND 1 FOLLOWING) as cnt
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
select
|
|
|
|
pk, a,
|
|
|
|
count(a) over (order by a desc
|
|
|
|
range between current row
|
|
|
|
and 1 following) as cnt
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
|
|
|
|
# Try with partitions
|
|
|
|
insert into t1 select 22, pk, a from t1;
|
|
|
|
select
|
|
|
|
part_id, pk, a,
|
|
|
|
count(a) over (PARTITION BY part_id
|
|
|
|
ORDER BY a
|
2016-09-22 18:22:34 +02:00
|
|
|
RANGE BETWEEN UNBOUNDED PRECEDING
|
2016-05-08 22:04:41 +02:00
|
|
|
AND 10 FOLLOWING) as cnt
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
select
|
|
|
|
pk, a,
|
|
|
|
count(a) over (PARTITION BY part_id
|
|
|
|
ORDER BY a
|
2016-09-22 18:22:34 +02:00
|
|
|
RANGE BETWEEN UNBOUNDED PRECEDING
|
2016-05-08 22:04:41 +02:00
|
|
|
AND 1 PRECEDING) as cnt
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
drop table t1;
|
|
|
|
|
|
|
|
--echo # Try a RANGE frame over non-integer datatype:
|
|
|
|
|
|
|
|
create table t1 (
|
|
|
|
col1 int,
|
|
|
|
a decimal(5,3)
|
|
|
|
);
|
|
|
|
|
|
|
|
insert into t1 values (1, 0.45);
|
|
|
|
insert into t1 values (1, 0.5);
|
|
|
|
insert into t1 values (1, 0.55);
|
|
|
|
insert into t1 values (1, 1.21);
|
|
|
|
insert into t1 values (1, 1.22);
|
|
|
|
insert into t1 values (1, 3.33);
|
|
|
|
|
|
|
|
select
|
2016-09-22 18:22:34 +02:00
|
|
|
a,
|
|
|
|
count(col1) over (order by a
|
|
|
|
range between 0.1 preceding
|
|
|
|
and 0.1 following)
|
2016-05-08 22:04:41 +02:00
|
|
|
from t1;
|
|
|
|
|
|
|
|
drop table t1;
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
--echo #
|
|
|
|
--echo # RANGE-type frames and NULL values
|
|
|
|
--echo #
|
2016-05-08 22:04:41 +02:00
|
|
|
create table t1 (
|
|
|
|
pk int,
|
|
|
|
a int,
|
|
|
|
b int
|
|
|
|
);
|
|
|
|
|
|
|
|
insert into t1 values (1, NULL,1);
|
|
|
|
insert into t1 values (2, NULL,1);
|
|
|
|
insert into t1 values (3, NULL,1);
|
|
|
|
insert into t1 values (4, 10 ,1);
|
|
|
|
insert into t1 values (5, 11 ,1);
|
|
|
|
insert into t1 values (6, 12 ,1);
|
|
|
|
insert into t1 values (7, 13 ,1);
|
|
|
|
insert into t1 values (8, 14 ,1);
|
|
|
|
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, a,
|
|
|
|
count(b) over (order by a
|
|
|
|
range between 2 preceding
|
2016-05-08 22:04:41 +02:00
|
|
|
and 2 following) as CNT
|
|
|
|
from t1;
|
|
|
|
drop table t1;
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
--echo #
|
2016-05-08 22:04:41 +02:00
|
|
|
--echo # Try ranges that have bound1 > bound2. The standard actually allows them
|
2016-09-22 18:22:34 +02:00
|
|
|
--echo #
|
2016-05-08 22:04:41 +02:00
|
|
|
|
|
|
|
create table t0 (a int);
|
|
|
|
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
|
|
|
|
|
|
|
create table t1 (pk int, c int);
|
|
|
|
insert into t1 select a+1,1 from t0;
|
|
|
|
update t1 set c=2 where pk not in (1,2,3,4);
|
|
|
|
select * from t1;
|
|
|
|
|
|
|
|
select
|
|
|
|
pk, c,
|
|
|
|
count(*) over (partition by c
|
|
|
|
order by pk
|
|
|
|
rows between 1 preceding
|
2016-09-22 18:22:34 +02:00
|
|
|
and 2 preceding)
|
2016-05-08 22:04:41 +02:00
|
|
|
as cnt
|
|
|
|
from t1;
|
|
|
|
|
2016-09-09 17:53:01 +02:00
|
|
|
select
|
|
|
|
pk, c,
|
|
|
|
sum(c) over (partition by c
|
|
|
|
order by pk
|
|
|
|
rows between 1 preceding
|
|
|
|
and 2 preceding)
|
|
|
|
as sum
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
select
|
|
|
|
pk, c,
|
|
|
|
sum(c) over (partition by c
|
|
|
|
order by pk
|
|
|
|
rows between 2 following
|
|
|
|
and 1 following)
|
|
|
|
as sum
|
|
|
|
from t1;
|
|
|
|
|
2016-05-08 22:04:41 +02:00
|
|
|
|
|
|
|
select
|
|
|
|
pk, c,
|
|
|
|
count(*) over (partition by c
|
|
|
|
order by pk
|
|
|
|
range between 1 preceding
|
2016-09-22 18:22:34 +02:00
|
|
|
and 2 preceding)
|
2016-05-08 22:04:41 +02:00
|
|
|
as cnt
|
|
|
|
from t1;
|
|
|
|
drop table t0, t1;
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # Error checking for frame bounds
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
create table t1 (a int, b int, c varchar(32));
|
|
|
|
insert into t1 values (1,1,'foo');
|
|
|
|
insert into t1 values (2,2,'bar');
|
|
|
|
--error ER_RANGE_FRAME_NEEDS_SIMPLE_ORDERBY
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over (order by a,b
|
|
|
|
range between unbounded preceding and current row)
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
--error ER_WRONG_TYPE_FOR_RANGE_FRAME
|
|
|
|
select
|
|
|
|
count(*) over (order by c
|
|
|
|
range between unbounded preceding and current row)
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
--error ER_WRONG_TYPE_FOR_RANGE_FRAME
|
|
|
|
select
|
|
|
|
count(*) over (order by a
|
|
|
|
range between 'abcd' preceding and current row)
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
--error ER_WRONG_TYPE_FOR_RANGE_FRAME
|
|
|
|
select
|
|
|
|
count(*) over (order by a
|
|
|
|
range between current row and 'foo' following)
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
--echo # Try range frame with invalid bounds
|
|
|
|
--error ER_WRONG_TYPE_FOR_ROWS_FRAME
|
|
|
|
select
|
|
|
|
count(*) over (order by a
|
|
|
|
rows between 0.5 preceding and current row)
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
--error ER_WRONG_TYPE_FOR_ROWS_FRAME
|
|
|
|
select
|
|
|
|
count(*) over (order by a
|
|
|
|
rows between current row and 3.14 following)
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
--echo #
|
2016-09-22 18:22:34 +02:00
|
|
|
--echo # EXCLUDE clause is parsed but not supported
|
2016-05-08 22:04:41 +02:00
|
|
|
--echo #
|
|
|
|
|
|
|
|
--error ER_FRAME_EXCLUSION_NOT_SUPPORTED
|
|
|
|
select
|
|
|
|
count(*) over (order by a
|
|
|
|
rows between 1 preceding and 1 following
|
|
|
|
exclude current row)
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
--error ER_FRAME_EXCLUSION_NOT_SUPPORTED
|
|
|
|
select
|
|
|
|
count(*) over (order by a
|
|
|
|
range between 1 preceding and 1 following
|
|
|
|
exclude ties)
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
--error ER_FRAME_EXCLUSION_NOT_SUPPORTED
|
|
|
|
select
|
|
|
|
count(*) over (order by a
|
|
|
|
range between 1 preceding and 1 following
|
|
|
|
exclude group)
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
# EXCLUDE NO OTHERS means 'don't exclude anything'
|
|
|
|
select
|
|
|
|
count(*) over (order by a
|
|
|
|
rows between 1 preceding and 1 following
|
|
|
|
exclude no others)
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
drop table t1;
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
--echo #
|
|
|
|
--echo # Window function in grouping query
|
|
|
|
--echo #
|
2016-05-08 22:04:41 +02:00
|
|
|
|
|
|
|
create table t1 (
|
|
|
|
username varchar(32),
|
|
|
|
amount int
|
|
|
|
);
|
2016-09-22 18:22:34 +02:00
|
|
|
|
2016-05-08 22:04:41 +02:00
|
|
|
insert into t1 values
|
|
|
|
('user1',1),
|
|
|
|
('user1',5),
|
|
|
|
('user1',3),
|
|
|
|
('user2',10),
|
|
|
|
('user2',20),
|
|
|
|
('user2',30);
|
2016-09-22 18:22:34 +02:00
|
|
|
|
|
|
|
select
|
2016-05-08 22:04:41 +02:00
|
|
|
username,
|
2016-09-22 18:22:34 +02:00
|
|
|
sum(amount) as s,
|
2016-05-08 22:04:41 +02:00
|
|
|
rank() over (order by s desc)
|
|
|
|
from t1
|
|
|
|
group by username;
|
|
|
|
|
|
|
|
drop table t1;
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
--echo #
|
|
|
|
--echo # mdev-9719: Window function in prepared statement
|
|
|
|
--echo #
|
2016-05-08 22:04:41 +02:00
|
|
|
|
|
|
|
create table t1(a int, b int, x char(32));
|
|
|
|
insert into t1 values (2, 10, 'xx');
|
|
|
|
insert into t1 values (2, 10, 'zz');
|
|
|
|
insert into t1 values (2, 20, 'yy');
|
|
|
|
insert into t1 values (3, 10, 'xxx');
|
|
|
|
insert into t1 values (3, 20, 'vvv');
|
2016-09-22 18:22:34 +02:00
|
|
|
|
2016-05-08 22:04:41 +02:00
|
|
|
prepare stmt from 'select a, row_number() over (partition by a order by b) from t1';
|
|
|
|
--sorted_result
|
|
|
|
execute stmt;
|
|
|
|
|
|
|
|
drop table t1;
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
--echo #
|
|
|
|
--echo # mdev-9754: Window name resolution in prepared statement
|
|
|
|
--echo #
|
2016-05-08 22:04:41 +02:00
|
|
|
|
|
|
|
create table t0 (a int);
|
|
|
|
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
2016-09-22 18:22:34 +02:00
|
|
|
|
2016-05-08 22:04:41 +02:00
|
|
|
create table t1 (pk int, c int);
|
|
|
|
insert into t1 select a+1,1 from t0;
|
|
|
|
update t1 set c=2 where pk not in (1,2,3,4);
|
|
|
|
select * from t1;
|
2016-09-22 18:22:34 +02:00
|
|
|
|
|
|
|
prepare stmt from
|
|
|
|
'select
|
|
|
|
pk, c,
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over w1 as CNT
|
|
|
|
from t1
|
2016-09-22 18:22:34 +02:00
|
|
|
window w1 as (partition by c order by pk
|
2016-05-08 22:04:41 +02:00
|
|
|
rows between 2 preceding and 2 following)';
|
|
|
|
execute stmt;
|
|
|
|
|
|
|
|
drop table t0,t1;
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # EXPLAIN FORMAT=JSON support for window functions
|
|
|
|
--echo #
|
|
|
|
create table t0 (a int);
|
|
|
|
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
|
|
|
|
|
|
|
explain format=json select rank() over (order by a) from t0;
|
|
|
|
|
|
|
|
create table t1 (a int, b int, c int);
|
|
|
|
insert into t1 select a,a,a from t0;
|
|
|
|
|
|
|
|
explain format=json
|
|
|
|
select
|
|
|
|
a,
|
|
|
|
rank() over (order by sum(b))
|
|
|
|
from t1
|
|
|
|
group by a;
|
|
|
|
|
|
|
|
explain format=json
|
|
|
|
select
|
|
|
|
a,
|
|
|
|
rank() over (order by sum(b))
|
|
|
|
from t1
|
|
|
|
group by a
|
|
|
|
order by null;
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # Check how window function works together with GROUP BY and HAVING
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
select b,max(a) as MX, rank() over (order by b) from t1 group by b having MX in (3,5,7);
|
|
|
|
explain format=json
|
|
|
|
select b,max(a) as MX, rank() over (order by b) from t1 group by b having MX in (3,5,7);
|
|
|
|
|
|
|
|
drop table t1;
|
|
|
|
drop table t0;
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # Building ordering index for window functions
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
create table t1 (
|
|
|
|
pk int primary key,
|
|
|
|
a int,
|
|
|
|
b int,
|
|
|
|
c int
|
|
|
|
);
|
|
|
|
|
|
|
|
insert into t1 values
|
|
|
|
(101 , 0, 10, 1),
|
|
|
|
(102 , 0, 10, 2),
|
|
|
|
(103 , 1, 10, 3),
|
|
|
|
(104 , 1, 10, 4),
|
|
|
|
(108 , 2, 10, 5),
|
|
|
|
(105 , 2, 20, 6),
|
|
|
|
(106 , 2, 20, 7),
|
|
|
|
(107 , 2, 20, 8),
|
|
|
|
(109 , 4, 20, 9),
|
|
|
|
(110 , 4, 20, 10),
|
|
|
|
(111 , 5, NULL, 11),
|
|
|
|
(112 , 5, 1, 12),
|
|
|
|
(113 , 5, NULL, 13),
|
|
|
|
(114 , 5, NULL, 14),
|
|
|
|
(115 , 5, NULL, 15),
|
|
|
|
(116 , 6, 1, NULL),
|
|
|
|
(117 , 6, 1, 10),
|
|
|
|
(118 , 6, 1, 1),
|
|
|
|
(119 , 6, 1, NULL),
|
|
|
|
(120 , 6, 1, NULL),
|
|
|
|
(121 , 6, 1, NULL),
|
|
|
|
(122 , 6, 1, 2),
|
|
|
|
(123 , 6, 1, 20),
|
|
|
|
(124 , 6, 1, -10),
|
|
|
|
(125 , 6, 1, NULL),
|
|
|
|
(126 , 6, 1, NULL),
|
|
|
|
(127 , 6, 1, NULL);
|
|
|
|
|
|
|
|
--sorted_result
|
|
|
|
select sum(b) over (partition by a order by b,pk
|
|
|
|
rows between unbounded preceding and current row) as c1,
|
|
|
|
avg(b) over (w1 rows between 1 preceding and 1 following) as c2,
|
2016-09-22 18:22:34 +02:00
|
|
|
sum(c) over (w2 rows between 1 preceding and 1 following) as c5,
|
2016-05-08 22:04:41 +02:00
|
|
|
avg(b) over (w1 rows between 5 preceding and 5 following) as c3,
|
|
|
|
sum(b) over (w1 rows between 1 preceding and 1 following) as c4
|
2016-09-22 18:22:34 +02:00
|
|
|
from t1
|
2016-05-08 22:04:41 +02:00
|
|
|
window w1 as (partition by a order by b,pk),
|
|
|
|
w2 as (partition by b order by c,pk);
|
|
|
|
|
|
|
|
drop table t1;
|
|
|
|
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # MDEV-9848: Window functions: reuse sorting and/or scanning
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
create table t1 (a int, b int, c int);
|
2016-09-22 18:22:34 +02:00
|
|
|
insert into t1 values
|
2016-05-08 22:04:41 +02:00
|
|
|
(1,3,1),
|
|
|
|
(2,2,1),
|
|
|
|
(3,1,1);
|
|
|
|
|
|
|
|
--echo # Check using counters
|
|
|
|
flush status;
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
2016-05-08 22:04:41 +02:00
|
|
|
rank() over (partition by c order by a),
|
|
|
|
rank() over (partition by c order by b)
|
|
|
|
from t1;
|
|
|
|
show status like '%sort%';
|
|
|
|
|
|
|
|
flush status;
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
2016-05-08 22:04:41 +02:00
|
|
|
rank() over (partition by c order by a),
|
|
|
|
rank() over (partition by c order by a)
|
|
|
|
from t1;
|
|
|
|
show status like '%sort%';
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
# Check using EXPLAIN FORMAT=JSON
|
2016-05-08 22:04:41 +02:00
|
|
|
explain format=json
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
2016-05-08 22:04:41 +02:00
|
|
|
rank() over (partition by c order by a),
|
|
|
|
rank() over (partition by c order by a)
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
explain format=json
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
2016-05-08 22:04:41 +02:00
|
|
|
rank() over (order by a),
|
|
|
|
row_number() over (order by a)
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
explain format=json
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
2016-05-08 22:04:41 +02:00
|
|
|
rank() over (partition by c order by a),
|
|
|
|
count(*) over (partition by c)
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
explain format=json
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
2016-05-08 22:04:41 +02:00
|
|
|
count(*) over (partition by c),
|
|
|
|
rank() over (partition by c order by a)
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
drop table t1;
|
|
|
|
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # MDEV-9847: Window functions: crash with big_tables=1
|
|
|
|
--echo #
|
|
|
|
create table t1(a int);
|
|
|
|
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
|
|
|
set @tmp=@@big_tables;
|
|
|
|
set big_tables=1;
|
|
|
|
select rank() over (order by a) from t1;
|
|
|
|
set big_tables=@tmp;
|
|
|
|
drop table t1;
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # Check if "ORDER BY window_func" works
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
create table t1 (s1 int, s2 char(5));
|
|
|
|
insert into t1 values (1,'a');
|
|
|
|
insert into t1 values (null,null);
|
|
|
|
insert into t1 values (1,null);
|
|
|
|
insert into t1 values (null,'a');
|
|
|
|
insert into t1 values (2,'b');
|
|
|
|
insert into t1 values (-1,'');
|
|
|
|
|
|
|
|
explain format=json
|
|
|
|
select *, row_number() over (order by s1, s2) as X from t1 order by X desc;
|
|
|
|
select *, row_number() over (order by s1, s2) as X from t1 order by X desc;
|
|
|
|
drop table t1;
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # Try window functions that are not directly present in the select list
|
|
|
|
--echo #
|
|
|
|
create table t1 (a int, b int);
|
2016-09-22 18:22:34 +02:00
|
|
|
insert into t1 values
|
2016-05-08 22:04:41 +02:00
|
|
|
(1,3),
|
|
|
|
(2,2),
|
|
|
|
(3,1);
|
|
|
|
|
2016-09-16 20:38:22 +02:00
|
|
|
select
|
|
|
|
a, b,
|
|
|
|
rank() over (order by a), rank() over (order by b),
|
|
|
|
rank() over (order by a) - rank() over (order by b) as diff
|
2016-05-08 22:04:41 +02:00
|
|
|
from
|
|
|
|
t1;
|
|
|
|
|
|
|
|
drop table t1;
|
|
|
|
|
|
|
|
create table t1 (i int);
|
|
|
|
insert into t1 values (1),(2);
|
|
|
|
SELECT MAX(i) OVER (PARTITION BY (i)) FROM t1;
|
|
|
|
drop table t1;
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # Check the 0 in ROWS 0 PRECEDING
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
create table t1 (
|
|
|
|
part_id int,
|
|
|
|
pk int,
|
|
|
|
a int
|
|
|
|
);
|
|
|
|
|
|
|
|
insert into t1 values (1, 1, 1);
|
|
|
|
insert into t1 values (1, 2, 2);
|
|
|
|
insert into t1 values (1, 3, 4);
|
|
|
|
insert into t1 values (1, 4, 8);
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
2016-05-08 22:04:41 +02:00
|
|
|
pk, a,
|
|
|
|
sum(a) over (order by pk rows between 0 preceding and current row)
|
|
|
|
from t1;
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
pk, a,
|
2016-05-08 22:04:41 +02:00
|
|
|
sum(a) over (order by pk rows between 1 preceding and 0 preceding)
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
insert into t1 values (200, 1, 1);
|
|
|
|
insert into t1 values (200, 2, 2);
|
|
|
|
insert into t1 values (200, 3, 4);
|
|
|
|
insert into t1 values (200, 4, 8);
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
2016-05-08 22:04:41 +02:00
|
|
|
part_id, pk, a,
|
|
|
|
sum(a) over (partition by part_id order by pk rows between 0 preceding and current row)
|
|
|
|
from t1;
|
|
|
|
|
2016-09-22 18:22:34 +02:00
|
|
|
select
|
|
|
|
part_id, pk, a,
|
2016-05-08 22:04:41 +02:00
|
|
|
sum(a) over (partition by part_id order by pk rows between 1 preceding and 0 preceding)
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
drop table t1;
|
|
|
|
--echo #
|
|
|
|
--echo # MDEV-9780, The "DISTINCT must not bet converted into GROUP BY when
|
2016-09-22 18:22:34 +02:00
|
|
|
--echo # window functions are present" part
|
2016-05-08 22:04:41 +02:00
|
|
|
--echo #
|
|
|
|
|
|
|
|
create table t1 (part_id int, a int);
|
|
|
|
insert into t1 values
|
|
|
|
(100, 1),
|
|
|
|
(100, 2),
|
|
|
|
(100, 2),
|
|
|
|
(100, 3),
|
|
|
|
(2000, 1),
|
|
|
|
(2000, 2),
|
|
|
|
(2000, 3),
|
|
|
|
(2000, 3),
|
|
|
|
(2000, 3);
|
|
|
|
|
|
|
|
select rank() over (partition by part_id order by a) from t1;
|
|
|
|
select distinct rank() over (partition by part_id order by a) from t1;
|
|
|
|
explain format=json
|
|
|
|
select distinct rank() over (partition by part_id order by a) from t1;
|
|
|
|
|
|
|
|
drop table t1;
|
|
|
|
|
|
|
|
--echo #
|
2016-09-22 18:22:34 +02:00
|
|
|
--echo # MDEV-9893: Window functions with different ORDER BY lists,
|
|
|
|
--echo # one of these lists containing an expression
|
2016-05-08 22:04:41 +02:00
|
|
|
--echo #
|
|
|
|
|
|
|
|
create table t1 (s1 int, s2 char(5));
|
|
|
|
insert into t1 values (1,'a');
|
|
|
|
insert into t1 values (null,null);
|
|
|
|
insert into t1 values (3,null);
|
|
|
|
insert into t1 values (4,'a');
|
|
|
|
insert into t1 values (2,'b');
|
|
|
|
insert into t1 values (-1,'');
|
2016-09-22 18:22:34 +02:00
|
|
|
|
|
|
|
select
|
2016-05-08 22:04:41 +02:00
|
|
|
*,
|
|
|
|
ROW_NUMBER() OVER (order by s1),
|
2016-09-22 18:22:34 +02:00
|
|
|
CUME_DIST() OVER (order by -s1)
|
2016-05-08 22:04:41 +02:00
|
|
|
from t1;
|
|
|
|
|
|
|
|
drop table t1;
|
|
|
|
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # MDEV-9925: Wrong result with aggregate function as a window function
|
|
|
|
--echo #
|
|
|
|
create table t1 (i int);
|
|
|
|
insert into t1 values (1),(2);
|
|
|
|
select i, sum(i) over (partition by i) from t1;
|
|
|
|
drop table t1;
|
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # MDEV-9922: Assertion `!join->only_const_tables() && fsort' failed in int create_sort_index
|
|
|
|
--echo #
|
|
|
|
create view v1 as select 1 as i;
|
|
|
|
select rank() over (order by i) from v1;
|
|
|
|
drop view v1;
|
|
|
|
|
2016-09-04 04:51:10 +02:00
|
|
|
--echo #
|
|
|
|
--echo # MDEV-10097: Assertion `count > 0' failed in Item_sum_sum::add_helper(bool)
|
|
|
|
--echo #
|
|
|
|
CREATE TABLE `orders` (
|
|
|
|
`o_orderkey` int(11) NOT NULL,
|
|
|
|
`o_custkey` int(11) DEFAULT NULL,
|
|
|
|
PRIMARY KEY (`o_orderkey`)
|
2016-09-22 18:22:34 +02:00
|
|
|
) DEFAULT CHARSET=latin1;
|
2016-09-04 04:51:10 +02:00
|
|
|
|
|
|
|
INSERT INTO `orders` VALUES (59908,242);
|
|
|
|
INSERT INTO `orders` VALUES (59940,238);
|
|
|
|
|
|
|
|
SELECT o_custkey, avg(o_custkey) OVER (PARTITION BY abs(o_custkey)
|
|
|
|
ORDER BY o_custkey
|
|
|
|
RANGE BETWEEN 15 FOLLOWING
|
|
|
|
AND 15 FOLLOWING) from orders;
|
|
|
|
DROP table orders;
|
2016-09-21 04:56:05 +02:00
|
|
|
|
|
|
|
--echo #
|
2016-09-22 18:22:34 +02:00
|
|
|
--echo # MDEV-10842: window functions with the same order column
|
2016-09-21 04:56:05 +02:00
|
|
|
--echo # but different directions
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
create table t1 (
|
|
|
|
pk int primary key,
|
|
|
|
a int,
|
|
|
|
b int,
|
|
|
|
c char(10)
|
|
|
|
);
|
|
|
|
|
|
|
|
insert into t1 values
|
|
|
|
( 1, 0, 1, 'one'),
|
|
|
|
( 2, 0, 2, 'two'),
|
|
|
|
( 3, 0, 3, 'three'),
|
|
|
|
( 4, 1, 1, 'one'),
|
|
|
|
( 5, 1, 1, 'two'),
|
|
|
|
( 6, 1, 2, 'three'),
|
|
|
|
( 7, 2, NULL, 'n_one'),
|
|
|
|
( 8, 2, 1, 'n_two'),
|
|
|
|
( 9, 2, 2, 'n_three'),
|
|
|
|
(10, 2, 0, 'n_four'),
|
|
|
|
(11, 2, 10, NULL);
|
|
|
|
|
|
|
|
select pk,
|
|
|
|
row_number() over (order by pk desc) as r_desc,
|
|
|
|
row_number() over (order by pk asc) as r_asc
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
drop table t1;
|
2016-09-23 23:22:20 +02:00
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # MDEV-10874: two window functions with ccompatible sorting
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
create table t1 (
|
|
|
|
pk int primary key,
|
|
|
|
a int,
|
|
|
|
b int,
|
|
|
|
c char(10),
|
|
|
|
d decimal(10, 3),
|
|
|
|
e real
|
|
|
|
);
|
|
|
|
insert into t1 values
|
|
|
|
( 1, 0, 1, 'one', 0.1, 0.001),
|
|
|
|
( 2, 0, 2, 'two', 0.2, 0.002),
|
|
|
|
( 3, 0, 3, 'three', 0.3, 0.003),
|
|
|
|
( 4, 1, 2, 'three', 0.4, 0.004),
|
|
|
|
( 5, 1, 1, 'two', 0.5, 0.005),
|
|
|
|
( 6, 1, 1, 'one', 0.6, 0.006),
|
|
|
|
( 7, 2, NULL, 'n_one', 0.5, 0.007),
|
|
|
|
( 8, 2, 1, 'n_two', NULL, 0.008),
|
|
|
|
( 9, 2, 2, NULL, 0.7, 0.009),
|
|
|
|
(10, 2, 0, 'n_four', 0.8, 0.010),
|
|
|
|
(11, 2, 10, NULL, 0.9, NULL);
|
|
|
|
|
|
|
|
select pk, a, d,
|
|
|
|
sum(d) over (partition by a order by pk
|
|
|
|
ROWS between 1 preceding and current row) as sum_1,
|
|
|
|
sum(d) over (order by a
|
|
|
|
ROWS BETWEEN 1 preceding and 2 following) as sum_2
|
|
|
|
from t1;
|
|
|
|
explain format=json
|
|
|
|
select pk, a, d,
|
|
|
|
sum(d) over (partition by a order by pk
|
|
|
|
ROWS between 1 preceding and current row) as sum_1,
|
|
|
|
sum(d) over (order by a
|
|
|
|
ROWS BETWEEN 1 preceding and 2 following) as sum_2
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
select pk, a, d,
|
|
|
|
sum(d) over (partition by a order by pk desc
|
|
|
|
ROWS between 1 preceding and current row) as sum_1,
|
|
|
|
sum(d) over (order by a
|
|
|
|
ROWS BETWEEN 1 preceding and 2 following) as sum_2
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
drop table t1;
|
2016-09-23 23:42:12 +02:00
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # MDEV-9941: two window functions with compatible partitions
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
create table t1 (
|
|
|
|
a int,
|
|
|
|
b int,
|
|
|
|
c int
|
|
|
|
);
|
|
|
|
|
|
|
|
insert into t1 values
|
|
|
|
(10, 1, 1),
|
|
|
|
(10, 3, 10),
|
|
|
|
(10, 1, 10),
|
|
|
|
(10, 3, 100),
|
|
|
|
(10, 5, 1000),
|
|
|
|
(10, 1, 100);
|
|
|
|
|
|
|
|
explain format=json
|
|
|
|
select
|
|
|
|
a,b,c,
|
|
|
|
row_number() over (partition by a),
|
|
|
|
row_number() over (partition by a, b)
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
drop table t1;
|
2016-09-16 20:38:22 +02:00
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # MDEV-10815: Window Function Expressions Wrong Results
|
|
|
|
--echo #
|
|
|
|
create table t(a decimal(35,10), b int);
|
|
|
|
insert into t(a,b) values(1,1);
|
|
|
|
insert into t(a,b) values(2,1);
|
|
|
|
insert into t(a,b) values(0,1);
|
|
|
|
insert into t(a,b) values(1, 2);
|
|
|
|
insert into t(a,b) values(1.5,2);
|
|
|
|
insert into t(a,b) values(3, 2);
|
|
|
|
insert into t(a,b) values(4.5,2);
|
|
|
|
select a, b,
|
|
|
|
sum(t.a) over (partition by t.b order by a) as simple_sum,
|
|
|
|
sum(t.a) over (partition by t.b order by a) + 1 as sum_and_const,
|
|
|
|
sum(t.b) over (partition by t.b order by a) + sum(t.a) over (partition by t.b order by a) as sum_and_sum
|
|
|
|
from t
|
|
|
|
order by t.b, t.a;
|
|
|
|
drop table t;
|
2016-09-17 11:17:48 +02:00
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # MDEV-10669: Crash in SELECT with window function used
|
|
|
|
--echo #
|
|
|
|
create table t(a decimal(35,10), b int);
|
|
|
|
insert into t(a,b) values(1,1);
|
|
|
|
insert into t(a,b) values(2,1);
|
|
|
|
insert into t(a,b) values(0,1);
|
|
|
|
SELECT (CASE WHEN sum(t.a) over (partition by t.b)=0 THEN null ELSE null END) AS a FROM t;
|
|
|
|
SELECT ifnull(((t.a) / CASE WHEN sum(t.a) over(partition by t.b) =0 then null else null end) ,0) from t;
|
|
|
|
SELECT sum(t.a) over (partition by t.b order by a),
|
|
|
|
sqrt(ifnull((sum(t.a) over (partition by t.b order by a)), 0))
|
|
|
|
from t;
|
|
|
|
drop table t;
|
2016-09-29 10:15:00 +02:00
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # MDEV-10868: view definitions with window functions
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
create table t0 (a int);
|
|
|
|
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
|
|
|
|
|
|
|
create table t1 (pk int, c int);
|
|
|
|
insert into t1 select a+1,1 from t0;
|
|
|
|
update t1 set c=2 where pk not in (1,2,3,4);
|
|
|
|
select * from t1;
|
|
|
|
|
|
|
|
let $q=
|
|
|
|
select pk, c, c/count(*) over (partition by c order by pk
|
|
|
|
rows between 1 preceding and 2 following) as CNT
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
eval $q;
|
|
|
|
eval create view v1 as $q;
|
|
|
|
show create view v1;
|
|
|
|
select * from v1;
|
|
|
|
|
|
|
|
let $q=
|
|
|
|
select pk, c, c/count(*) over w1 as CNT from t1
|
|
|
|
window w1 as (partition by c order by pk rows between 1 preceding and 2 following);
|
|
|
|
|
|
|
|
eval $q;
|
|
|
|
eval create view v2 as $q;
|
|
|
|
show create view v2;
|
|
|
|
select * from v2;
|
|
|
|
|
|
|
|
let $q=
|
|
|
|
select pk, c, c/count(*) over w1 as CNT from t1
|
|
|
|
window w1 as (partition by c order by pk rows unbounded preceding);
|
|
|
|
|
|
|
|
eval $q;
|
|
|
|
eval create view v3 as $q;
|
|
|
|
show create view v3;
|
|
|
|
select * from v3;
|
|
|
|
|
2016-09-30 22:13:18 +02:00
|
|
|
let $q=
|
|
|
|
select pk, c, c/count(*) over (partition by c order by pk
|
|
|
|
range between 3 preceding and current row) as CNT
|
|
|
|
from t1;
|
|
|
|
|
|
|
|
eval $q;
|
|
|
|
eval create view v4 as $q;
|
|
|
|
show create view v4;
|
|
|
|
select * from v4;
|
|
|
|
|
|
|
|
drop view v1,v2,v3,v4;
|
2016-09-29 10:15:00 +02:00
|
|
|
drop table t0,t1;
|
2017-01-30 20:56:23 +01:00
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # MDEV-10875: window function in subquery
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
CREATE TABLE t1 (i INT);
|
|
|
|
INSERT INTO t1 VALUES (3),(1);
|
|
|
|
|
|
|
|
CREATE TABLE t2 (c VARCHAR(8));
|
|
|
|
INSERT INTO t2 VALUES ('foo'),('bar'),('foo');
|
|
|
|
|
|
|
|
SELECT COUNT(*) OVER (PARTITION BY c) FROM t2;
|
|
|
|
|
|
|
|
SELECT * FROM t1 WHERE i IN ( SELECT COUNT(*) OVER (PARTITION BY c) FROM t2 );
|
|
|
|
|
|
|
|
DROP TABLE t1, t2;
|
2017-01-31 19:32:59 +01:00
|
|
|
|
|
|
|
--echo #
|
|
|
|
--echo # MDEV-9976: window function without PARTITION BY and ORDER BY
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
CREATE TABLE t1 (id int, a int);
|
|
|
|
INSERT INTO t1 VALUES
|
|
|
|
(1,1000), (2,1100), (3,1800), (4,1500), (5,1700), (6,1200),
|
|
|
|
(7,2000), (8,2100), (9,1600);
|
|
|
|
|
|
|
|
--sorted_result
|
|
|
|
SELECT id, sum(a) OVER (PARTITION BY id
|
|
|
|
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
|
|
|
|
FROM t1;
|
|
|
|
|
|
|
|
--sorted_result
|
|
|
|
SELECT id, sum(a) OVER (ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
|
|
|
|
FROM t1;
|
|
|
|
|
|
|
|
DROP TABLE t1;
|
|
|
|
|
2017-02-02 04:15:28 +01:00
|
|
|
--echo #
|
|
|
|
--echo # MDEV-11867: window function with aggregation
|
|
|
|
--echo # over the result of grouping
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
create table t1 (
|
|
|
|
username varchar(32),
|
|
|
|
amount int
|
|
|
|
);
|
|
|
|
|
|
|
|
insert into t1 values
|
|
|
|
('user1',1),
|
|
|
|
('user1',5),
|
|
|
|
('user1',3),
|
|
|
|
('user2',10),
|
|
|
|
('user2',20),
|
|
|
|
('user2',30);
|
|
|
|
|
|
|
|
select username, sum(amount) as s, avg(sum(amount)) over (order by s desc)
|
|
|
|
from t1
|
|
|
|
group by username;
|
|
|
|
|
|
|
|
select username, sum(amount), avg(sum(amount)) over (order by sum(amount) desc)
|
|
|
|
from t1
|
|
|
|
group by username;
|
|
|
|
|
|
|
|
drop table t1;
|
|
|
|
|
2017-02-03 02:57:55 +01:00
|
|
|
--echo #
|
|
|
|
--echo # MDEV-11594: window function over implicit grouping
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
create table test.t1 (id int);
|
|
|
|
insert into test.t1 values (1), (2), (3), (2);
|
|
|
|
|
|
|
|
select sum(id) over (order by sum(id)) from t1;
|
|
|
|
|
|
|
|
select sum(sum(id)) over (order by sum(id)) from t1;
|
|
|
|
|
|
|
|
drop table t1;
|
2017-02-02 04:15:28 +01:00
|
|
|
|
2017-02-03 09:10:36 +01:00
|
|
|
--echo #
|
|
|
|
--echo # MDEV-9923: integer constant in order by list
|
|
|
|
--echo # of window specification
|
|
|
|
--echo #
|
|
|
|
|
|
|
|
create table test.t1 (id int);
|
|
|
|
insert into test.t1 values (1), (2), (3), (2);
|
|
|
|
|
|
|
|
select rank() over (order by 1) from t1;
|
|
|
|
select rank() over (order by 2) from t1;
|
|
|
|
select rank() over (partition by id order by 2) from t1;
|
|
|
|
|
|
|
|
drop table t1;
|