---
title: "What is difference between ROW_NUMBER() vs RANK() vs DENSE_RANK()?"  
description: "What is difference between ROW_NUMBER() vs RANK() vs DENSE_RANK()?"  
author: "Ravi Vishwakarma"  
published: 2026-05-12  
updated: 2026-05-14  
canonical: https://answers.mindstick.com/qa/116598/what-is-difference-between-row_number-vs-rank-vs-dense_rank  
category: "database"  
tags: ["database", "sql server"]  
reading_time: 3 minutes  

---

# What is difference between ROW_NUMBER() vs RANK() vs DENSE_RANK()?

**What is [difference](https://yourviews.mindstick.com/story/5016/chia-vs-basil-seeds-what-s-the-difference) between ROW_NUMBER() vs [RANK](https://www.mindstick.com/interview/34502/difference-between-rank-vs-dense_rank)() vs DENSE_RANK()?**

## Answers

### Answer by Ravi Vishwakarma

`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

```plaintext
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

```plaintext
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

```plaintext
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:

```plaintext
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


---

Original Source: https://answers.mindstick.com/qa/116598/what-is-difference-between-row_number-vs-rank-vs-dense_rank

Copyright © MindStick Software Pvt. Ltd. This Markdown version is provided for developers, AI systems, and offline reading.
