MySQL
ROW_NUMBER
SQL functions
database management
SQL tutorial

ROW_NUMBER in MySQL

System Design practice on Codemia

Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.

Practice system design

MySQL introduced the ROW_NUMBER() window function in its version 8.0. This function is widely utilized in SQL databases for assigning sequential integers to rows within a result set. It is especially useful for pagination, ranking, and ordering data for analysis purposes.

Overview

ROW_NUMBER() is a window function that assigns a unique sequential integer to rows within a partition of a result set. The syntax for ROW_NUMBER() is straightforward:

sql
ROW_NUMBER() OVER ([PARTITION BY <expr>[, ... ]] ORDER BY <expr> [ASC | DESC][, ... ])

Key Components

  • OVER(): Required clause that defines the window for the function, including optional partitioning and ordering.
  • PARTITION BY 1<expr>: Optional clause to divide the result set into partitions to which the function is applied.
  • ORDER BY <expr> [ASC | DESC]: Required clause to determine the order of rows within each partition.

Use Cases

ROW_NUMBER() is particularly beneficial for tasks such as:

  1. Pagination: When dealing with large datasets, paginating results for display in smaller chunks can improve performance and user experience.
  2. Rankings: Assigning ranks to rows based on certain criteria (e.g., sales figures, examination scores).
  3. Deduplication: Using the ROW_NUMBER() in conjunction with Common Table Expressions (CTEs) to remove duplicate rows from datasets.

Examples

Example 1: Basic Usage Without Partition

Consider a table employees with columns id, name, and salary:

idnamesalary
1Alice70000
2Bob80000
3Charlie60000
4Dave70000

Assign a row number to each employee ordered by their salary.

sql
1SELECT 
2    id,
3    name,
4    salary,
5    ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
6FROM 
7    employees;

Result:

idnamesalaryrow_num
2Bob800001
1Alice700002
4Dave700003
3Charlie600004

Example 2: Using Partition By

Given a table sales with columns id, department, and amount:

iddepartmentamount
1Sales5000
2Engineering7000
3Sales2000
4Engineering3000

Assign a row number within each department based on the amount.

sql
1SELECT 
2    id,
3    department,
4    amount,
5    ROW_NUMBER() OVER (PARTITION BY department ORDER BY amount DESC) AS row_num
6FROM 
7    sales;

Result:

iddepartmentamountrow_num
3Sales50001
1Sales20002
2Engineering70001
4Engineering30002

Example 3: Deduplication

To remove duplicates based on a specific column, the ROW_NUMBER() can be combined with a CTE.

Suppose you have employees table that might have duplicate names:

sql
1WITH ranked_employees AS (
2  SELECT 
3    id, 
4    name, 
5    salary, 
6    ROW_NUMBER() OVER (PARTITION BY name ORDER BY id) as rn
7  FROM 
8    employees
9)
10SELECT 
11    id, 
12    name, 
13    salary 
14FROM 
15    ranked_employees
16WHERE 
17    rn = 1;

Alternatives and Limitations

Alternatives

While ROW_NUMBER() is powerful, you may sometimes consider using other window functions based on the requirements:

  • RANK(): Similar to ROW_NUMBER(), but assigns the same number to rows with identical values in the ordering column, causing possible gaps in numbering.
  • DENSE_RANK(): Similar to RANK(), but without gaps in numbering for rows with identical values.

Limitations

  • Non-deterministic without ORDER BY: The OVER clause must include an ORDER BY, or row numbering is non-deterministic.
  • Performance: Using window functions on large datasets can be computationally intensive.

Summary Table

FeatureDescription
FunctionalityAssigns sequential integer to rows in a partition or dataset
Required ClausesOVER(ORDER BY <expr>[, ... ])
Optional ClausesPARTITION BY <expr>[, ... ]
Use CasesPagination, ranking, deduplication, etc.
AlternativesRANK(), DENSE_RANK()
LimitationsPerformance on large datasets, potential for non-determinism

By leveraging the ROW_NUMBER() function, users can efficiently perform a variety of tasks that require ranking, ordering, or even deduplication of records, enhancing both performance and scalability in data handling.


Related reading
Course
Beginner
27 lessons
10 hours
System Design Fundamentals

Build a strong foundation in designing scalable, reliable distributed systems.

View the course
Track what you have practised

A free account saves your progress, solutions and study plan across every problem on Codemia.

System Design practice on Codemia

Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.

Practice system design

All Rights Reserved.