Bird
Raised Fist0
SQLquery~10 mins

RANK and DENSE_RANK difference in SQL - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - RANK and DENSE_RANK difference
Start with ordered data
↓
Apply RANK function
↓
Assign ranks with gaps for ties
↓
Apply DENSE_RANK function
↓
Assign ranks without gaps for ties
↓
Compare results
↓
End
We start with ordered data, apply RANK which assigns ranks with gaps for ties, then apply DENSE_RANK which assigns ranks without gaps, and finally compare the two results.
Execution Sample
SQL
SELECT name, score,
       RANK() OVER (ORDER BY score DESC) AS rank,
       DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank
FROM players;
This query ranks players by score using both RANK and DENSE_RANK to show the difference in handling ties.
Execution Table
RowNameScoreRANK() ResultDENSE_RANK() ResultExplanation
1Alice10011Highest score, rank 1 for both
2Bob9022Second highest, no tie yet
3Charlie9022Tie with Bob, same rank
4David8043After tie, RANK skips rank 3, DENSE_RANK continues sequentially
5Eve7054No tie, ranks continue
6Frank7054Tie with Eve, same rank
7Grace6075After tie, RANK skips rank 6, DENSE_RANK continues sequentially
💡 All rows processed, showing how RANK leaves gaps after ties, DENSE_RANK does not.
Variable Tracker
VariableRow 1Row 2Row 3Row 4Row 5Row 6Row 7
RANK()1224557
DENSE_RANK()1223445
Key Moments - 2 Insights
Why does RANK() skip numbers after ties but DENSE_RANK() does not?
RANK() assigns the same rank to tied rows but leaves gaps in the sequence for the next rank, as seen in rows 3 and 4 in the execution_table. DENSE_RANK() assigns ranks without gaps, continuing the sequence immediately after ties.
What happens to the rank numbers when multiple rows have the same score?
Both RANK() and DENSE_RANK() assign the same rank number to all tied rows, as shown for Bob and Charlie with score 90. The difference is in how the next rank number is assigned after the tie.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the RANK() value for David (Row 4)?
A3
B2
C4
D5
💡 Hint
Check the RANK() Result column for Row 4 in the execution_table.
At which row does DENSE_RANK() assign rank 3?
ARow 3 (Charlie)
BRow 4 (David)
CRow 5 (Eve)
DRow 2 (Bob)
💡 Hint
Look at the DENSE_RANK() Result column in the execution_table.
If Eve's score changed to 85, how would RANK() for David change?
AIt would become 5
BIt would remain 4
CIt would become 3
DIt would become 2
💡 Hint
Consider how ranks shift when a new score is inserted between existing scores, referencing the variable_tracker.
Concept Snapshot
RANK() assigns ranks with gaps after ties.
DENSE_RANK() assigns ranks without gaps.
Both assign same rank to tied rows.
Use ORDER BY to define ranking order.
RANK() skips numbers after ties; DENSE_RANK() does not.
Full Transcript
This visual execution shows how RANK() and DENSE_RANK() assign ranks to rows ordered by score. Both functions assign the same rank to tied rows, but RANK() leaves gaps in the ranking sequence after ties, while DENSE_RANK() continues ranks sequentially without gaps. For example, Bob and Charlie tie with score 90 and both get rank 2. The next rank for David is 4 with RANK() but 3 with DENSE_RANK(). This difference is important when you want continuous ranking numbers or want to reflect gaps caused by ties.

Practice

(1/5)
1. What is the main difference between RANK() and DENSE_RANK() functions in SQL?
easy
A. DENSE_RANK() assigns random ranks, RANK() assigns sequential ranks.
B. RANK() skips rank numbers after ties, DENSE_RANK() does not skip numbers.
C. RANK() and DENSE_RANK() always return the same results.
D. DENSE_RANK() skips rank numbers after ties, RANK() does not skip numbers.

Solution

  1. Step 1: Understand how RANK() works with ties

    RANK() assigns the same rank to tied rows but skips the next rank numbers accordingly. For example, if two rows tie for rank 1, the next rank will be 3.
  2. Step 2: Understand how DENSE_RANK() works with ties

    DENSE_RANK() also assigns the same rank to tied rows but does not skip rank numbers. So after two rows tied at rank 1, the next rank will be 2.
  3. Final Answer:

    RANK() skips rank numbers after ties, DENSE_RANK() does not skip numbers. -> Option B
  4. Quick Check:

    Skipping ranks = RANK() [OK]
Hint: Remember: RANK skips numbers after ties, DENSE_RANK does not [OK]
Common Mistakes:
  • Thinking both functions behave the same with ties
  • Confusing which function skips rank numbers
  • Assuming ranks are assigned randomly
2. Which of the following is the correct syntax to get the rank of employees ordered by salary using DENSE_RANK()?
easy
A. SELECT employee_id, RANK() BY salary FROM employees;
B. SELECT employee_id, DENSE_RANK(salary) FROM employees ORDER BY salary DESC;
C. SELECT employee_id, DENSE_RANK() OVER (ORDER BY salary DESC) AS rank FROM employees;
D. SELECT employee_id, DENSE_RANK() ORDER BY salary FROM employees;

Solution

  1. Step 1: Identify correct DENSE_RANK() syntax

    The correct syntax uses DENSE_RANK() OVER (ORDER BY column) to rank rows based on a column.
  2. Step 2: Check each option

    SELECT employee_id, DENSE_RANK() OVER (ORDER BY salary DESC) AS rank FROM employees; uses the correct window function syntax. Options A, B, and D have syntax errors or misuse the function.
  3. Final Answer:

    SELECT employee_id, DENSE_RANK() OVER (ORDER BY salary DESC) AS rank FROM employees; -> Option C
  4. Quick Check:

    Window function syntax = SELECT employee_id, DENSE_RANK() OVER (ORDER BY salary DESC) AS rank FROM employees; [OK]
Hint: Use OVER (ORDER BY ...) with ranking functions [OK]
Common Mistakes:
  • Omitting OVER clause
  • Passing column inside function parentheses
  • Using wrong keywords like BY instead of ORDER BY
3. Given the table Scores with values:
Player | Score
Alice | 100
Bob | 90
Carol | 90
Dave | 80

What will be the output of this query?
SELECT Player, Score, RANK() OVER (ORDER BY Score DESC) AS Rank, DENSE_RANK() OVER (ORDER BY Score DESC) AS DenseRank FROM Scores;
medium
A. [{"Player":"Alice","Score":100,"Rank":1,"DenseRank":1},{"Player":"Bob","Score":90,"Rank":2,"DenseRank":2},{"Player":"Carol","Score":90,"Rank":2,"DenseRank":2},{"Player":"Dave","Score":80,"Rank":4,"DenseRank":3}]
B. [{"Player":"Alice","Score":100,"Rank":1,"DenseRank":1},{"Player":"Bob","Score":90,"Rank":3,"DenseRank":2},{"Player":"Carol","Score":90,"Rank":3,"DenseRank":2},{"Player":"Dave","Score":80,"Rank":4,"DenseRank":3}]
C. [{"Player":"Alice","Score":100,"Rank":1,"DenseRank":1},{"Player":"Bob","Score":90,"Rank":2,"DenseRank":3},{"Player":"Carol","Score":90,"Rank":2,"DenseRank":3},{"Player":"Dave","Score":80,"Rank":3,"DenseRank":4}]
D. [{"Player":"Alice","Score":100,"Rank":1,"DenseRank":1},{"Player":"Bob","Score":90,"Rank":2,"DenseRank":2},{"Player":"Carol","Score":90,"Rank":3,"DenseRank":2},{"Player":"Dave","Score":80,"Rank":4,"DenseRank":3}]

Solution

  1. Step 1: Assign RANK() values

    Alice has highest score 100, rank 1. Bob and Carol tie at 90, both get rank 2. Because of tie at rank 2, next rank is 4 for Dave.
  2. Step 2: Assign DENSE_RANK() values

    Alice is dense rank 1. Bob and Carol tie at 90, dense rank 2. Dave has next dense rank 3 (no skipping).
  3. Final Answer:

    [{"Player":"Alice","Score":100,"Rank":1,"DenseRank":1},{"Player":"Bob","Score":90,"Rank":2,"DenseRank":2},{"Player":"Carol","Score":90,"Rank":2,"DenseRank":2},{"Player":"Dave","Score":80,"Rank":4,"DenseRank":3}] -> Option A
  4. Quick Check:

    RANK skips numbers, DENSE_RANK does not [OK]
Hint: Check how ranks jump after ties for RANK vs DENSE_RANK [OK]
Common Mistakes:
  • Assigning dense ranks with gaps
  • Not skipping ranks in RANK after ties
  • Mixing up rank numbers for tied rows
4. You wrote this query:
SELECT name, RANK() ORDER BY score DESC FROM players;

But it gives a syntax error. What is the problem?
medium
A. Missing OVER() clause after RANK() function.
B. ORDER BY cannot be used inside SELECT clause.
C. RANK() requires a parameter inside parentheses.
D. The table name is missing in the query.

Solution

  1. Step 1: Check RANK() function usage

    RANK() is a window function and must be followed by OVER() clause specifying order.
  2. Step 2: Identify missing OVER() clause

    The query uses RANK() without OVER(), causing syntax error.
  3. Final Answer:

    Missing OVER() clause after RANK() function. -> Option A
  4. Quick Check:

    Window functions need OVER() [OK]
Hint: Always add OVER() after window functions like RANK() [OK]
Common Mistakes:
  • Forgetting OVER() clause
  • Trying to put ORDER BY inside SELECT without OVER()
  • Assuming RANK() takes parameters
5. You have a sales table:
Salesperson | SalesAmount
John | 500
Jane | 700
Joe | 700
Jill | 600

You want to assign ranks so that tied salespeople share the same rank and the next rank number is not skipped. Which query correctly achieves this?
hard
A. SELECT Salesperson, SalesAmount, RANK() OVER (ORDER BY SalesAmount DESC) AS Rank FROM sales;
B. SELECT Salesperson, SalesAmount, RANK() OVER (PARTITION BY SalesAmount ORDER BY SalesAmount DESC) AS Rank FROM sales;
C. SELECT Salesperson, SalesAmount, ROW_NUMBER() OVER (ORDER BY SalesAmount DESC) AS Rank FROM sales;
D. SELECT Salesperson, SalesAmount, DENSE_RANK() OVER (ORDER BY SalesAmount DESC) AS Rank FROM sales;

Solution

  1. Step 1: Understand ranking requirements

    Tied salespeople should share the same rank, and the next rank number should not skip any numbers.
  2. Step 2: Choose correct function

    DENSE_RANK() assigns same rank to ties and does not skip ranks. RANK() skips ranks after ties. ROW_NUMBER() never assigns same rank to ties. SELECT Salesperson, SalesAmount, RANK() OVER (PARTITION BY SalesAmount ORDER BY SalesAmount DESC) AS Rank FROM sales; misuses PARTITION BY.
  3. Final Answer:

    SELECT Salesperson, SalesAmount, DENSE_RANK() OVER (ORDER BY SalesAmount DESC) AS Rank FROM sales; -> Option D
  4. Quick Check:

    DENSE_RANK() for no skipped ranks after ties [OK]
Hint: Use DENSE_RANK() to avoid skipping ranks after ties [OK]
Common Mistakes:
  • Using RANK() when no skipping is wanted
  • Using ROW_NUMBER() which never ties
  • Incorrect use of PARTITION BY in ranking
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard