MySQL | Ranking Functions
Last Updated :
02 Feb, 2023
The ranking functions in MySQL are used to rank each row of a partition. The ranking functions are also part of MySQL windows functions list.
- These functions are always used with OVER() clause.
- The ranking functions always assign rank on basis of ORDER BY clause.
- The rank is assigned to rows in a sequential manner.
- The assignment of rank to rows always start with 1 for every new partition.
There are 3 types of ranking functions supported in MySQL-
- dense_rank(): This function will assign rank to each row within a partition without gaps. Basically, the ranks are assigned in a consecutive manner i.e if there is a tie between values then they will be assigned the same rank, and next rank value will be one greater than the previous rank assigned.
- rank(): This function will assign rank to each row within a partition with gaps. Here, ranks are assigned in a non-consecutive manner i.e if there is a tie between values then they will be assigned same rank, and next rank value will be previous rank + no of peers(duplicates).
- percent_rank(): It returns the percentile rank of a row within a partition that ranges from 0 to 1. It tells the percentage of partition values less than the value in the current row, excluding the highest value.
In order to understand these functions in a better way. Let consider a table "result"-
s_name | subjects | mark |
---|
Pratibha | Maths | 100 |
Ankita | Science | 80 |
Swarna | English | 100 |
Ankita | Maths | 65 |
Pratibha | Science | 80 |
Swarna | Science | 50 |
Pratibha | English | 70 |
Swarna | Maths | 85 |
Ankita | English | 90 |
Queries:
- dense_rank() function-
SELECT subjects, s_name, mark, dense_rank()
OVER ( partition by subjects order by mark desc )
AS 'dense_rank' FROM result;
- Output-Explanation-
Here, table is partitioned on the basis of "subjects".
order by clause is used to arrange rows of each partition in descending order by "mark".
dense_rank() is used to rank students in each subject.
Note, for science subject there is a tie between Ankita and Pratibha, so they both are assigned same rank. The next rank value is incremented by 1 i.e 2 for Swarna.
Subjects | Name | Mark | Dense_rank |
---|
English | Swarna | 100 | 1 |
English | Ankita | 90 | 2 |
English | Pratibha | 70 | 3 |
Maths | Pratibha | 100 | 1 |
Maths | Swarna | 85 | 2 |
Maths | Ankita | 65 | 3 |
Science | Ankita | 80 | 1 |
Science | Pratibha | 80 | 1 |
Science | Swarna | 50 | 2 |
- rank() function-
SELECT subjects, s_name, mark, rank()
OVER ( partition by subjects order by mark desc )
AS 'rank' FROM result;
- Output-Explanation-
It's output is similar to dense_rank() function.
Except, that for Science subject in case of a tie between Ankita and Pratibha, the next rank value is incremented by 2 i.e 3 for Swarna.
Subjects | Name | Mark | rank |
---|
English | Swarna | 100 | 1 |
English | Ankita | 90 | 2 |
English | Pratibha | 70 | 3 |
Maths | Pratibha | 100 | 1 |
Maths | Swarna | 85 | 2 |
Maths | Ankita | 65 | 3 |
Science | Ankita | 80 | 1 |
Science | Pratibha | 80 | 1 |
Science | Swarna | 50 | 3 |
- percent_rank() function-
SELECT subjects, s_name, mark, percent_rank()
OVER ( partition by subjects order by mark )
AS 'percent_rank' FROM result;
- Output-Explanation:
Here, the percent_rank() function calculate percentile rank in ascending order by "mark" column.
percent_rank is calculated using following formula-
(rank - 1) / (rows - 1)
rank is the rank of each row of the partition resulted using rank() function.
rows represent the no of rows in that partition.
To clear this formula, consider following query-
SELECT subjects, s_name, mark, rank()
OVER ( partition by subjects order by mark )-1
AS 'rank-1', count(*) over (partition by subjects)-1
AS 'total_rows-1', percent_rank()
OVER ( partition by subjects order by mark ) AS 'percenr_rank'
FROM result;
- Output-
Subjects | Name | Mark | rank-1 | total_rows-1 | percent_rank |
---|
English | Pratibha | 70 | 0 | 2 | 0 |
English | Ankita | 90 | 1 | 2 | 0.5 |
English | Swarna | 100 | 2 | 2 | 1 |
Maths | Ankita | 65 | 0 | 2 | 0 |
Maths | Swarna | 85 | 1 | 2 | 0.5 |
Maths | Pratibha | 100 | 2 | 2 | 1 |
Science | Swarna | 50 | 0 | 2 | 0 |
Science | Ankita | 80 | 1 | 2 | 0.5 |
Science | Pratibha | 80 | 1 | 2 | 0.5 |
Subjects | Name | Mark | percent_rank |
---|
English | Pratibha | 70 | 0 |
English | Ankita | 90 | 0.5 |
English | Swarna | 100 | 1 |
Maths | Ankita | 65 | 0 |
Maths | Swarna | 85 | 0.5 |
Maths | Pratibha | 100 | 1 |
Science | Swarna | 50 | 0 |
Science | Pratibha | 80 | 0.5 |
Science | Ankita | 80 | 0.5 |
Similar Reads
MySQL Window Functions MySQL Window Functions are advanced SQL capabilities that enable expensive calculations across sets of rows related to the current row. Aggregate functions collapse the result set. These functions, in general, permit ranking, running totals, moving averages, and access to data from other rows within
6 min read
MySQL Statistical Functions MySQL provides a rich set of statistical functions that we can use to perform various statistical analyses directly within the database. These functions help us to derive insights and trends from large datasets and are essential for data analysis. This article will explore some of the key MySQL stat
3 min read
MySQL MAX() Function In database management, efficient data retrieval is important for making informed decisions. The MySQL MAX() function stands as a useful function for extracting the highest value from a set of records, offering significant benefits for data analysis and reporting. Whether you're identifying peak sal
3 min read
MySQL MIN() Function The MySQL MIN() function is used to get the smallest value in a number set. Suppose you have a table with a list of different products and their corresponding prices; you would want to know which one has the lowest price. Here, the MIN() function will return that answer to you in the easiest possibl
3 min read
STRCMP() Function in MySQL STRCMP() function in MySQL is used to compare two strings. If both of the strings are same then it returns 0, if the first argument is smaller than the second according to the defined order it returns -1 and it returns 1 when the second one is smaller the first one. Syntax : STRCMP(Str1, Str2) Param
3 min read
LEAST() Function in MySQL The LEAST() function in MySQL is a versatile tool that returns the smallest (minimum) value from a list of expressions. It can be used with numbers, strings, or even columns of data to find the minimum value according to their data type.In this article, We will learn about LEAST() Function in MySQL
4 min read