Difference between RANK() and DENSE_RANK() in PostgreSQL/MySQL

The RANK() and DENSE_RANK() functions are used to rank each row within a result set. The ranks are assigned in a sequence. Both functions assign the same rank to the same elements. The difference lies in the rank assignment after the same elements. We can differentiate as follows:

  • RANK(): If two or more elements are the same, the RANK() function will allocate them the same value and the next rank value will be the current rank plus the duplicated items.
  • DENSE_RANK(): If two or more elements are the same, the DENSE_RANK() function will allocate them the same value and the next rank value will be the next consecutive number.

Let’s understand from the following illustration:

Difference between the output of RANK() and DENSE_RANK()
Difference between the output of RANK() and DENSE_RANK()

In this illustration, you can see the rank assignment of the RANK() and the DENSE_RANK() functions. Consider the first two same values 95, and rank value 2 is assigned to both values. The RANK() function will assign a rank value of 4 and the DENSE_RANK() will assign a rank value of 3. The same is applied to the second same value 80.

Syntax

The syntax of RANK() and DENSE_RANK() functions follow the same pattern:

  • They are used with the OVER() clause.
  • The rank is allocated on the basis of the ORDER BY clause.
  • The PARTITION BY clause is optional that is used to rank within different partitions.

The syntax of the RANK() is as follows:

SELECT column_names,
RANK() OVER(
PARTITION BY expression
ORDER BY expression [ASC/DESC]
) rank_column_name
FROM table name;
Syntax of RANK() in MySQL

We can replace RANK() with DENSE_RANK() in the above syntax for a DENSE_RANK() query.

Examples

Consider the following table for the examples:

Students

ID

Name

Gender

City

Marks

1

Ali

Male

Lahore

90

2

Basit

Male

Okara

100

3

Sana

Female

Lahore

70

4

Dua

Female

Lahore

95

5

Raza

Male

Lahore

95

6

Saba

Female

Karachi

80

7

Riaz

Male

Karachi

85

8

Eman

Female

Lahore

80

Let’s run the RANK() and DENSE_RANK() to rank students based on marks in the PostgreSQL database.

SELECT ID, Name, Marks,
RANK() OVER(ORDER BY Marks DESC) AS _rank,
DENSE_RANK() OVER(ORDER BY Marks DESC) AS _dense_rank
FROM Students;

Let’s run the RANK() and DENSE_RANK() to rank students based on marks in the MySQL database.

SELECT ID, Name, Marks,
RANK() OVER (ORDER BY Marks DESC) _rank,
DENSE_RANK() OVER(ORDER BY Marks DESC) _dense_rank
FROM Students;

As we explained earlier, we can see the different rank assignments in the output.

We can also use the RANK() and DENSE_RANK() functions on text-based columns, i.e., City, etc.

Code examples with the PARTITION BY clause

Let’s use the RANK() and DENSE_RANK() functions with the PARTITION BY clause in PostgreSQL to rank the students in each city.

SELECT ID, Name, City, Marks,
RANK() OVER(
PARTITION BY City
ORDER BY Marks DESC) AS _rank,
DENSE_RANK() OVER(
PARTITION BY City
ORDER BY Marks DESC) AS _dense_rank
FROM Students;

Let’s use the RANK() and DENSE_RANK() functions with the PARTITION BY clause in MySQL to rank the students in each city.

SELECT ID, Name, City, Marks,
RANK() OVER(
PARTITION BY City
ORDER BY Marks DESC) _rank,
DENSE_RANK() OVER(
PARTITION BY City
ORDER BY Marks DESC) _dense_rank
FROM Students;

There are two same marks values in Lahore city. We can see the rank difference in the output of the above playgrounds.

New on Educative
Learn to Code
Learn any Language as a beginner
Develop a human edge in an AI powered world and learn to code with AI from our beginner friendly catalog
🏆 Leaderboard
Daily Coding Challenge
Solve a new coding challenge every day and climb the leaderboard

Free Resources

Copyright ©2025 Educative, Inc. All rights reserved