Back to articles list Articles Cookbook
Updated: 30th Oct 2024 6 minutes read

What Is the RANK() Function in SQL?

Who are your top 10 customers? Who are the top-performing employees in each department? To answer questions like these, you’ll need to rank the output of your SQL query. Let’s see how the RANK() function assists with ranking results in SQL.

There are many use cases in which you might need to rank rows in SQL. You may want to rank customers based on the sales volume, students based on their exam results, company assets based on their present value, departments based on the number of employees, or users based on their date of registration.

Ranking is an important and common tool in data analysis. In this tutorial, I’ll provide detailed explanations of how to rank rows in SQL.

To get confident with ranking rows in SQL, check out our interactive Window Functions course. It also covers RANK() and other ranking functions that have different approaches to processing the same values in the provided column.

Introduction to the RANK() Function

The RANK() function is one of the window functions in SQL. Window functions look at part of the data and compute the results for this part.

The RANK() function, specifically, assigns a rank to each row based on a provided column. RANK() is included in the SELECT statement with the following syntax:

RANK() OVER (ORDER BY column ASC|DESC)

Basically, you add another column to your result set. This column includes the rank of each record based on the order specified after the ORDER BY keyword. This entails specifying (1) the column to use for sorting the rows and (2) whether the order should be ascending or descending.

The first row gets rank 1, and the following rows get higher rankings. If any rows have the same value in the column used for ordering, they are ranked the same. The RANK() function leaves gaps in such cases.

For example, if the first and second rows have the same value in the provided column, they both get the rank 1. Then, the third row gets the rank 3 (i.e., rank 2 will be missing).

Now, let’s see the RANK() function in action.

Basic RANK() Function Example

To see how the RANK() function works in practice, we’ll go through an example. Let’s imagine we have a team of developers. We want to rank them based on their experience. Here’s the table we start with:

developers
idfirst_namelast_namelevelyears_experience
10JackDavisjunior1
11HelenBrownjunior0
12KateWilliamssenior4
13AlexMillersenior8
14SophiaMooremid-level3
15NickJacksonmid-level3
16StevenMartinjunior2
17MeganStevensjunior1
18JohnJonessenior5
19MaxWebermid-level4

Now, our task is to show the developers’ first name, last name, seniority level, years of experience, and rank. We want the most experienced developer to get the rank 1.

Here’s our SQL query together with the result set:

SELECT 
  first_name, 
  last_name, 
  level, 
  years_experience,
  RANK() OVER (ORDER BY years_experience DESC)
FROM developers;
first_namelast_namelevelyears_experiencerank
AlexMillersenior81
JohnJonessenior52
MaxWebermid-level43
KateWilliamssenior43
NickJacksonmid-level35
SophiaMooremid-level35
StevenMartinjunior27
MeganStevensjunior18
JackDavisjunior18
HelenBrownjunior010

To rank the developers based on their experience, we have included the following field in the SELECT statement:

RANK() OVER (ORDER BY years_experience DESC)

We define the order after the ORDER BY clause by specifying the column to use for sorting (years_experience) and the order (descending). Then, we rank the developers based on this order.

We see that the developer with 8 years of experience gets rank 1, the developer with 5 years of experience gets rank 2, and the two developers with 4 years of experience both get rank 3. Note that the RANK() function leaves a gap here, and the next developers get rank 5 (i.e., rank 4 is missing).

Now you have an idea of how the RANK() function works, including how it processes the same values in the column used for sorting. You can find more use cases in this complete guide to ranking rows in SQL.

Now, we will move to more advanced examples.

Ranking Within Different Groups

In our first example, we ranked the entire result set. Now, let’s say we want to have a separate ranking for each of the seniority levels (i.e., junior, mid-level, and senior).

With the RANK() function in SQL, we can do this by adding the PARTITION BY keyword and specifying the column to be used for grouping the records. Here’s our SQL query:

SELECT 
  first_name, 
  last_name, 
  level, 
  years_experience,
  RANK() OVER (PARTITION BY level ORDER BY years_experience DESC)
FROM developers;

In the OVER() clause, we first define how to group the records (using the level column) and then define how to order records within these groups (based on the years of experience, starting from the most experienced developer).

Here’s the resulting table:

first_namelast_namelevelyears_experiencerank
StevenMartinjunior21
JackDavisjunior12
MeganStevensjunior12
HelenBrownjunior04
MaxWebermid-level41
NickJacksonmid-level32
SophiaMooremid-level32
AlexMillersenior81
JohnJonessenior52
KateWilliamssenior43

Observe that we have separate rankings for the junior, mid-level, and senior levels. Still, the most experienced developer in each group gets rank 1, and the developers with less experience get higher rankings.

Also, note that while Kate Williams and Max Weber have the same 4 years of experience, Max gets rank 1 as the most experienced mid-level developer, while Kate gets rank 3 as the least experienced senior developer.

Now that you know how PARTITION BY works, it’s time to learn about other ranking functions.

Other Ranking Functions in SQL

To rank rows in SQL, you can also use the DENSE_RANK() and ROW_NUMBER() functions. The difference lies in the way these functions handle the same values.

As we learned earlier, the RANK() function gives the same rank to records with the same value and leaves a gap to account for these records. In contrast:

  • the DENSE_RANK() function doesn’t leave a gap;
  • the ROW_NUMBER() function ranks all records differently, even if the values are the same.

It’s easier to understand this difference with an example. So, let’s return to our first use case in which we ranked the entire result set. But, this time, we’ll also use DENSE_RANK() and ROW_NUMBER():

SELECT 
  first_name, last_name, level, years_experience,
  RANK() OVER (ORDER BY years_experience DESC),
  DENSE_RANK() OVER (ORDER BY years_experience DESC),
  ROW_NUMBER() OVER (ORDER BY years_experience DESC)
FROM developers;
first_namelast_namelevelyears_experiencerankdense_rankrow_number
AlexMillersenior8111
JohnJonessenior5222
MaxWebermid-level4333
KateWilliamssenior4334
NickJacksonmid-level3545
SophiaMooremid-level3546
StevenMartinjunior2757
MeganStevensjunior1868
JackDavisjunior1869
HelenBrownjunior010710

Similar to the RANK() function, the DENSE_RANK() function gives the same rank to the developers with the same years of experience (e.g., rank 3 to Kate Williams and Max Weber). However, the next rank in the dense_rank column is 4, leaving no gaps in the ranking.

On the other hand, the ROW_NUMBER() function assigns a different number to all of the developers, including the ones with the same years of experience. So, why does Max get rank 3 and Kate rank 4? It’s an arbitrary choice, and you never know which of the records with the same value will be assigned a higher rank.

Now that you know the difference between the ranking functions, you can decide which one is more suitable for your use cases. If you’re not sure, see more examples of the RANK(), DENSE_RANK(), and ROW_NUMBER() functions in this overview article.

Time To Practice Ranking Functions!

Ranking functions are among the most common tools used by data analysts. So, you should feel confident with ranking in SQL. And confidence comes with practice.

Check out this Window Functions course that includes 218 interactive exercises covering ranking functions, analytics functions, advanced statistics computation with different window frames, etc.

Thanks for reading, and happy learning!