What is difference between ROW_NUMBER() vs RANK() vs DENSE_RANK()?

Asked 20 days ago Updated 18 days ago 93 views

1 Answer


0

ROW_NUMBER(), RANK(), and DENSE_RANK() are SQL window functions used for ranking rows.

The main difference is how they handle ties (duplicate values).

1. ROW_NUMBER()

Assigns a unique number to every row. Even if two rows have the same value, they get different numbers.

Example

SELECT name, salary,
       ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM employees;

Data

Name Salary
A 5000
B 4000
C 4000
D 3000

Output

Name Salary ROW_NUMBER
A 5000 1
B 4000 2
C 4000 3
D 3000 4

No ties allowed.

2. RANK()

Rows with the same value get the same rank. But skipped ranks appear after ties.

Example

SELECT name, salary,
       RANK() OVER (ORDER BY salary DESC) AS rank_num
FROM employees;

Output

Name Salary RANK
A 5000 1
B 4000 2
C 4000 2
D 3000 4

Notice:

Rank 3 is skipped.

3. DENSE_RANK()

Same values get the same rank, but no gaps in ranking.

Example

SELECT name, salary,
       DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank_num
FROM employees;

Output

Name Salary DENSE_RANK
A 5000 1
B 4000 2
C 4000 2
D 3000 3

No skipped ranks.

Quick Comparison

Function Duplicate Values Gaps in Ranking
ROW_NUMBER() No No
RANK() Yes Yes
DENSE_RANK() Yes No

Easy Memory Trick

Suppose marks are:

100, 90, 90, 80
Function Result
ROW_NUMBER() 1, 2, 3, 4
RANK() 1, 2, 2, 4
DENSE_RANK() 1, 2, 2, 3

Common Use Cases

  • ROW_NUMBER() → pagination, unique ordering
  • RANK() → competition ranking (1st, 2nd, 2nd, 4th)
  • DENSE_RANK() → leaderboard without gaps

Write Your Answer