What is difference between ROW_NUMBER() vs RANK() vs DENSE_RANK()?
What is difference between ROW_NUMBER() vs RANK() vs DENSE_RANK()?
0
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 orderingRANK()→ competition ranking (1st, 2nd, 2nd, 4th)DENSE_RANK()→ leaderboard without gaps