select percentile_disc(0.5) within group(order by score,test) over (partition by name) from t1;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'test) over (partition by name) from t1' at line 1
select percentile_cont(0.5) within group(order by score,test) over (partition by name) from t1;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'test) over (partition by name) from t1' at line 1
# Order by clause has no element
select percentile_disc(0.5) within group() over (partition by name) from t1;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') over (partition by name) from t1' at line 1
select percentile_cont(0.5) within group() over (partition by name) from t1;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') over (partition by name) from t1' at line 1
# No parameters to the percentile functions
select percentile_disc() within group() over (partition by name) from t1;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') within group() over (partition by name) from t1' at line 1
select percentile_cont() within group() over (partition by name) from t1;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') within group() over (partition by name) from t1' at line 1
#
# Test simple syntax
#
select name, percentile_cont(0.5) within group(order by score) over (partition by name) as c from t1;
name c
Chun 5.00000
Chun 5.00000
Kaolin 4.00000
Kaolin 4.00000
Kaolin 4.00000
Tatiana 4.00000
Tata 4.00000
no partition clause
Chun 5.0000000000
Chun 5.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Tatiana 4.0000000000
Tata 4.0000000000
select name, percentile_disc(0.5) within group(order by score) over (partition by name) as c from t1;
name c
Chun 3.0000000000
Chun 3.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Tatiana 4.0000000000
Tata 4.0000000000
# no partition clause
select name, percentile_disc(0.5) within group(order by score) over () from t1;
name percentile_disc(0.5) within group(order by score) over ()
Chun 4.00000
Chun 4.00000
Kaolin 4.00000
Kaolin 4.00000
Kaolin 4.00000
Tatiana 4.00000
Tata 4.00000
Chun 4.0000000000
Chun 4.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Tatiana 4.0000000000
Tata 4.0000000000
select name, percentile_cont(0.5) within group(order by score) over () from t1;
name percentile_cont(0.5) within group(order by score) over ()
Chun 4.00000
Chun 4.00000
Kaolin 4.00000
Kaolin 4.00000
Kaolin 4.00000
Tatiana 4.00000
Tata 4.00000
argument set to null
Chun 4.0000000000
Chun 4.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Tatiana 4.0000000000
Tata 4.0000000000
# argument set to null
select name, percentile_cont(null) within group(order by score) over (partition by name) from t1;
ERROR HY000: Numeric values are only allowed as arguments to percentile functions
ERROR HY000: percentile_cont function only accepts arguments that can be converted to numerical types
select name, percentile_disc(null) within group(order by score) over (partition by name) from t1;
ERROR HY000: Numeric values are only allowed as arguments to percentile functions
subqueries having percentile functions
ERROR HY000: percentile_disc function only accepts arguments that can be converted to numerical types
#subqueries having percentile functions
select * from ( select name , percentile_cont(0.5) within group ( order by score) over (partition by name ) from t1 ) as t;
name percentile_cont(0.5) within group ( order by score) over (partition by name )
Chun 5.00000
Chun 5.00000
Kaolin 4.00000
Kaolin 4.00000
Kaolin 4.00000
Tatiana 4.00000
Tata 4.00000
Chun 5.0000000000
Chun 5.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Tatiana 4.0000000000
Tata 4.0000000000
select * from ( select name , percentile_disc(0.5) within group ( order by score) over (partition by name ) from t1 ) as t;
name percentile_disc(0.5) within group ( order by score) over (partition by name )
Chun 3.00000
Chun 3.00000
Kaolin 4.00000
Kaolin 4.00000
Kaolin 4.00000
Tatiana 4.00000
Tata 4.00000
Chun 3.0000000000
Chun 3.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Tatiana 4.0000000000
Tata 4.0000000000
select name from t1 a where (select percentile_disc(0.5) within group (order by score) over (partition by name) from t1 b limit 1) >= 0.5;
name
Chun
...
...
@@ -65,241 +95,232 @@ Kaolin
Kaolin
Tatiana
Tata
disallowed fields in order by
#disallowed fields in order by
select score, percentile_cont(0.5) within group(order by name) over (partition by score) from t1;
ERROR HY000: Numeric datatype is required for Percentile_CONT function
ERROR HY000: Numeric datatype is required for percentile_cont function
select score, percentile_disc(0.5) within group(order by name) over (partition by score) from t1;
score percentile_disc(0.5) within group(order by name) over (partition by score)
3.0000 Chun
7.0000 Chun
3.0000 Chun
7.0000 Chun
4.0000 Tata
4.0000 Tata
4.0000 Tata
order by clause has more than one element
select percentile_disc(0.5) within group(order by score,test) over (partition by name) from t1;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'test) over (partition by name) from t1' at line 1
select percentile_cont(0.5) within group(order by score,test) over (partition by name) from t1;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'test) over (partition by name) from t1' at line 1
parameter value should be in the range of [0,1]
ERROR HY000: Numeric datatype is required for percentile_disc function
#parameter value should be in the range of [0,1]
select percentile_disc(1.5) within group(order by score) over (partition by name) from t1;
ERROR HY000: Argument to the percentile functions does not belong to the range [0,1]
ERROR HY000: Argument to the percentile_disc function does not belong to the range [0,1]
select percentile_cont(1.5) within group(order by score) over (partition by name) from t1;
ERROR HY000: Argument to the percentile functions does not belong to the range [0,1]
ERROR HY000: Argument to the percentile_cont function does not belong to the range [0,1]
#Argument should remain constant for the entire partition
select name,percentile_cont(test) within group(order by score) over (partition by name) from t1;
ERROR HY000: Argument to the percentile functions is not a constant
ERROR HY000: Argument to the percentile_cont function is not a constant for a partition
select name, percentile_disc(test) within group(order by score) over (partition by name) from t1;
ERROR HY000: Argument to the percentile functions is not a constant
only numerical types are allowed as argument to percentile functions
ERROR HY000: Argument to the percentile_disc function is not a constant for a partition
#only numerical types are allowed as argument to percentile functions
select name, percentile_cont(name) within group(order by score) over (partition by name) from t1;
ERROR HY000: Numeric values are only allowed as arguments to percentile functions
complete query with partition column
ERROR HY000: percentile_cont function only accepts arguments that can be converted to numerical types
select name, percentile_disc(name) within group(order by score) over (partition by name) from t1;
ERROR HY000: percentile_disc function only accepts arguments that can be converted to numerical types
#complete query with partition column
select name,cume_dist() over (partition by name order by score), percentile_disc(0.5) within group(order by score) over (partition by name) as c from t1;
name cume_dist() over (partition by name order by score) c
Chun 0.5000000000 3.00000
Chun 1.0000000000 3.00000
Kaolin 0.3333333333 4.00000
Kaolin 1.0000000000 4.00000
Kaolin 0.6666666667 4.00000
Tatiana 1.0000000000 4.00000
Tata 1.0000000000 4.00000
Chun 0.5000000000 3.0000000000
Chun 1.0000000000 3.0000000000
Kaolin 0.3333333333 4.0000000000
Kaolin 1.0000000000 4.0000000000
Kaolin 0.6666666667 4.0000000000
Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.0000000000
select name, percentile_cont(0.5) within group(order by score) over (partition by name) as c from t1;
name c
Chun 5.00000
Chun 5.00000
Kaolin 4.00000
Kaolin 4.00000
Kaolin 4.00000
Tatiana 4.00000
Tata 4.00000
Chun 5.0000000000
Chun 5.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Kaolin 4.0000000000
Tatiana 4.0000000000
Tata 4.0000000000
select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.1) within group(order by score) over (partition by name) as c from t1;
name b c
Chun 0.5000000000 3.00000
Chun 1.0000000000 3.00000
Kaolin 0.3333333333 3.00000
Kaolin 1.0000000000 3.00000
Kaolin 0.6666666667 3.00000
Tatiana 1.0000000000 4.00000
Tata 1.0000000000 4.00000
Chun 0.5000000000 3.0000000000
Chun 1.0000000000 3.0000000000
Kaolin 0.3333333333 3.0000000000
Kaolin 1.0000000000 3.0000000000
Kaolin 0.6666666667 3.0000000000
Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.0000000000
select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.2) within group(order by score) over (partition by name) as c from t1;
name b c
Chun 0.5000000000 3.00000
Chun 1.0000000000 3.00000
Kaolin 0.3333333333 3.00000
Kaolin 1.0000000000 3.00000
Kaolin 0.6666666667 3.00000
Tatiana 1.0000000000 4.00000
Tata 1.0000000000 4.00000
Chun 0.5000000000 3.0000000000
Chun 1.0000000000 3.0000000000
Kaolin 0.3333333333 3.0000000000
Kaolin 1.0000000000 3.0000000000
Kaolin 0.6666666667 3.0000000000
Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.0000000000
select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.3) within group(order by score) over (partition by name) as c from t1;
name b c
Chun 0.5000000000 3.00000
Chun 1.0000000000 3.00000
Kaolin 0.3333333333 3.00000
Kaolin 1.0000000000 3.00000
Kaolin 0.6666666667 3.00000
Tatiana 1.0000000000 4.00000
Tata 1.0000000000 4.00000
Chun 0.5000000000 3.0000000000
Chun 1.0000000000 3.0000000000
Kaolin 0.3333333333 3.0000000000
Kaolin 1.0000000000 3.0000000000
Kaolin 0.6666666667 3.0000000000
Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.0000000000
select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.4) within group(order by score) over (partition by name) as c from t1;
name b c
Chun 0.5000000000 3.00000
Chun 1.0000000000 3.00000
Kaolin 0.3333333333 4.00000
Kaolin 1.0000000000 4.00000
Kaolin 0.6666666667 4.00000
Tatiana 1.0000000000 4.00000
Tata 1.0000000000 4.00000
Chun 0.5000000000 3.0000000000
Chun 1.0000000000 3.0000000000
Kaolin 0.3333333333 4.0000000000
Kaolin 1.0000000000 4.0000000000
Kaolin 0.6666666667 4.0000000000
Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.0000000000
select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.5) within group(order by score) over (partition by name) as c from t1;
name b c
Chun 0.5000000000 3.00000
Chun 1.0000000000 3.00000
Kaolin 0.3333333333 4.00000
Kaolin 1.0000000000 4.00000
Kaolin 0.6666666667 4.00000
Tatiana 1.0000000000 4.00000
Tata 1.0000000000 4.00000
Chun 0.5000000000 3.0000000000
Chun 1.0000000000 3.0000000000
Kaolin 0.3333333333 4.0000000000
Kaolin 1.0000000000 4.0000000000
Kaolin 0.6666666667 4.0000000000
Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.0000000000
select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.6) within group(order by score) over (partition by name) as c from t1;
name b c
Chun 0.5000000000 7.00000
Chun 1.0000000000 7.00000
Kaolin 0.3333333333 4.00000
Kaolin 1.0000000000 4.00000
Kaolin 0.6666666667 4.00000
Tatiana 1.0000000000 4.00000
Tata 1.0000000000 4.00000
Chun 0.5000000000 7.0000000000
Chun 1.0000000000 7.0000000000
Kaolin 0.3333333333 4.0000000000
Kaolin 1.0000000000 4.0000000000
Kaolin 0.6666666667 4.0000000000
Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.0000000000
select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.7) within group(order by score) over (partition by name) as c from t1;
name b c
Chun 0.5000000000 7.00000
Chun 1.0000000000 7.00000
Kaolin 0.3333333333 7.00000
Kaolin 1.0000000000 7.00000
Kaolin 0.6666666667 7.00000
Tatiana 1.0000000000 4.00000
Tata 1.0000000000 4.00000
Chun 0.5000000000 7.0000000000
Chun 1.0000000000 7.0000000000
Kaolin 0.3333333333 7.0000000000
Kaolin 1.0000000000 7.0000000000
Kaolin 0.6666666667 7.0000000000
Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.0000000000
select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.8) within group(order by score) over (partition by name) as c from t1;
name b c
Chun 0.5000000000 7.00000
Chun 1.0000000000 7.00000
Kaolin 0.3333333333 7.00000
Kaolin 1.0000000000 7.00000
Kaolin 0.6666666667 7.00000
Tatiana 1.0000000000 4.00000
Tata 1.0000000000 4.00000
Chun 0.5000000000 7.0000000000
Chun 1.0000000000 7.0000000000
Kaolin 0.3333333333 7.0000000000
Kaolin 1.0000000000 7.0000000000
Kaolin 0.6666666667 7.0000000000
Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.0000000000
select name,cume_dist() over (partition by name order by score) as b, percentile_disc(0.9) within group(order by score) over (partition by name) as c from t1;
name b c
Chun 0.5000000000 7.00000
Chun 1.0000000000 7.00000
Kaolin 0.3333333333 7.00000
Kaolin 1.0000000000 7.00000
Kaolin 0.6666666667 7.00000
Tatiana 1.0000000000 4.00000
Tata 1.0000000000 4.00000
Chun 0.5000000000 7.0000000000
Chun 1.0000000000 7.0000000000
Kaolin 0.3333333333 7.0000000000
Kaolin 1.0000000000 7.0000000000
Kaolin 0.6666666667 7.0000000000
Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.0000000000
select name,cume_dist() over (partition by name order by score) as b, percentile_disc(1) within group(order by score) over (partition by name) as c from t1;
name b c
Chun 0.5000000000 7.00000
Chun 1.0000000000 7.00000
Kaolin 0.3333333333 7.00000
Kaolin 1.0000000000 7.00000
Kaolin 0.6666666667 7.00000
Tatiana 1.0000000000 4.00000
Tata 1.0000000000 4.00000
Chun 0.5000000000 7.0000000000
Chun 1.0000000000 7.0000000000
Kaolin 0.3333333333 7.0000000000
Kaolin 1.0000000000 7.0000000000
Kaolin 0.6666666667 7.0000000000
Tatiana 1.0000000000 4.0000000000
Tata 1.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(0) within group(order by score) over (partition by name) as c from t1;
median(score) over (partition by name) c
5.00000 3.00000
5.00000 3.00000
4.00000 3.00000
4.00000 3.00000
4.00000 3.00000
4.00000 4.00000
4.00000 4.00000
5.0000000000 3.0000000000
5.0000000000 3.0000000000
4.0000000000 3.0000000000
4.0000000000 3.0000000000
4.0000000000 3.0000000000
4.0000000000 4.0000000000
4.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(0.1) within group(order by score) over (partition by name) as c from t1;
median(score) over (partition by name) c
5.00000 3.40000
5.00000 3.40000
4.00000 3.20000
4.00000 3.20000
4.00000 3.20000
4.00000 4.00000
4.00000 4.00000
5.0000000000 3.4000000000
5.0000000000 3.4000000000
4.0000000000 3.2000000000
4.0000000000 3.2000000000
4.0000000000 3.2000000000
4.0000000000 4.0000000000
4.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(0.2) within group(order by score) over (partition by name) as c from t1;
median(score) over (partition by name) c
5.00000 3.80000
5.00000 3.80000
4.00000 3.40000
4.00000 3.40000
4.00000 3.40000
4.00000 4.00000
4.00000 4.00000
5.0000000000 3.8000000000
5.0000000000 3.8000000000
4.0000000000 3.4000000000
4.0000000000 3.4000000000
4.0000000000 3.4000000000
4.0000000000 4.0000000000
4.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(0.3) within group(order by score) over (partition by name) as c from t1;
median(score) over (partition by name) c
5.00000 4.20000
5.00000 4.20000
4.00000 3.60000
4.00000 3.60000
4.00000 3.60000
4.00000 4.00000
4.00000 4.00000
5.0000000000 4.2000000000
5.0000000000 4.2000000000
4.0000000000 3.6000000000
4.0000000000 3.6000000000
4.0000000000 3.6000000000
4.0000000000 4.0000000000
4.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(0.4) within group(order by score) over (partition by name) as c from t1;
median(score) over (partition by name) c
5.00000 4.60000
5.00000 4.60000
4.00000 3.80000
4.00000 3.80000
4.00000 3.80000
4.00000 4.00000
4.00000 4.00000
5.0000000000 4.6000000000
5.0000000000 4.6000000000
4.0000000000 3.8000000000
4.0000000000 3.8000000000
4.0000000000 3.8000000000
4.0000000000 4.0000000000
4.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(0.5) within group(order by score) over (partition by name) as c from t1;
median(score) over (partition by name) c
5.00000 5.00000
5.00000 5.00000
4.00000 4.00000
4.00000 4.00000
4.00000 4.00000
4.00000 4.00000
4.00000 4.00000
5.0000000000 5.0000000000
5.0000000000 5.0000000000
4.0000000000 4.0000000000
4.0000000000 4.0000000000
4.0000000000 4.0000000000
4.0000000000 4.0000000000
4.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(0.6) within group(order by score) over (partition by name) as c from t1;
median(score) over (partition by name) c
5.00000 5.40000
5.00000 5.40000
4.00000 4.60000
4.00000 4.60000
4.00000 4.60000
4.00000 4.00000
4.00000 4.00000
5.0000000000 5.4000000000
5.0000000000 5.4000000000
4.0000000000 4.6000000000
4.0000000000 4.6000000000
4.0000000000 4.6000000000
4.0000000000 4.0000000000
4.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(0.7) within group(order by score) over (partition by name) as c from t1;
median(score) over (partition by name) c
5.00000 5.80000
5.00000 5.80000
4.00000 5.20000
4.00000 5.20000
4.00000 5.20000
4.00000 4.00000
4.00000 4.00000
5.0000000000 5.8000000000
5.0000000000 5.8000000000
4.0000000000 5.2000000000
4.0000000000 5.2000000000
4.0000000000 5.2000000000
4.0000000000 4.0000000000
4.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(0.8) within group(order by score) over (partition by name) as c from t1;
median(score) over (partition by name) c
5.00000 6.20000
5.00000 6.20000
4.00000 5.80000
4.00000 5.80000
4.00000 5.80000
4.00000 4.00000
4.00000 4.00000
5.0000000000 6.2000000000
5.0000000000 6.2000000000
4.0000000000 5.8000000000
4.0000000000 5.8000000000
4.0000000000 5.8000000000
4.0000000000 4.0000000000
4.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(0.9) within group(order by score) over (partition by name) as c from t1;
median(score) over (partition by name) c
5.00000 6.60000
5.00000 6.60000
4.00000 6.40000
4.00000 6.40000
4.00000 6.40000
4.00000 4.00000
4.00000 4.00000
5.0000000000 6.6000000000
5.0000000000 6.6000000000
4.0000000000 6.4000000000
4.0000000000 6.4000000000
4.0000000000 6.4000000000
4.0000000000 4.0000000000
4.0000000000 4.0000000000
select median(score) over (partition by name), percentile_cont(1) within group(order by score) over (partition by name) as c from t1;