mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Users expect window functions to produce a certain ordering of rows in the final result set. Although the standard does not require this, we already have the filesort result done for when we computed the window function. If there is no ORDER BY attached to the query, just keep it till the SELECT is completely evaluated and use that to print the result. Update test cases as many did not take care to guarantee a stable result.
63 lines
1.6 KiB
Plaintext
63 lines
1.6 KiB
Plaintext
create table t1 (
|
|
pk int primary key,
|
|
a int,
|
|
b int
|
|
);
|
|
insert into t1 values
|
|
( 1 , 0, 10),
|
|
( 2 , 0, 10),
|
|
( 3 , 1, 10),
|
|
( 4 , 1, 10),
|
|
( 8 , 2, 10),
|
|
( 5 , 2, 20),
|
|
( 6 , 2, 20),
|
|
( 7 , 2, 20),
|
|
( 9 , 4, 20),
|
|
(10 , 4, 20);
|
|
select a,
|
|
percent_rank() over (order by a),
|
|
cume_dist() over (order by a)
|
|
from t1;
|
|
a percent_rank() over (order by a) cume_dist() over (order by a)
|
|
0 0.0000000000 0.2000000000
|
|
0 0.0000000000 0.2000000000
|
|
1 0.2222222222 0.4000000000
|
|
1 0.2222222222 0.4000000000
|
|
2 0.4444444444 0.8000000000
|
|
2 0.4444444444 0.8000000000
|
|
2 0.4444444444 0.8000000000
|
|
2 0.4444444444 0.8000000000
|
|
4 0.8888888889 1.0000000000
|
|
4 0.8888888889 1.0000000000
|
|
select pk,
|
|
percent_rank() over (order by pk),
|
|
cume_dist() over (order by pk)
|
|
from t1 order by pk;
|
|
pk percent_rank() over (order by pk) cume_dist() over (order by pk)
|
|
1 0.0000000000 0.1000000000
|
|
2 0.1111111111 0.2000000000
|
|
3 0.2222222222 0.3000000000
|
|
4 0.3333333333 0.4000000000
|
|
5 0.4444444444 0.5000000000
|
|
6 0.5555555556 0.6000000000
|
|
7 0.6666666667 0.7000000000
|
|
8 0.7777777778 0.8000000000
|
|
9 0.8888888889 0.9000000000
|
|
10 1.0000000000 1.0000000000
|
|
select a,
|
|
percent_rank() over (partition by a order by a),
|
|
cume_dist() over (partition by a order by a)
|
|
from t1;
|
|
a percent_rank() over (partition by a order by a) cume_dist() over (partition by a order by a)
|
|
0 0.0000000000 1.0000000000
|
|
0 0.0000000000 1.0000000000
|
|
1 0.0000000000 1.0000000000
|
|
1 0.0000000000 1.0000000000
|
|
2 0.0000000000 1.0000000000
|
|
2 0.0000000000 1.0000000000
|
|
2 0.0000000000 1.0000000000
|
|
2 0.0000000000 1.0000000000
|
|
4 0.0000000000 1.0000000000
|
|
4 0.0000000000 1.0000000000
|
|
drop table t1;
|