RANK() assigns a rank number to each row within a partition of a result set, with gaps in ranking when there are ties.
Click to reveal answer
beginner
How does DENSE_RANK() differ from RANK() in SQL?
DENSE_RANK() assigns ranks without gaps, so tied rows get the same rank and the next rank is the immediate next number.
Click to reveal answer
intermediate
If two rows tie for rank 2, what rank will the next row get with RANK()?
The next row will get rank 4, because RANK() leaves gaps after ties.
Click to reveal answer
intermediate
If two rows tie for rank 2, what rank will the next row get with DENSE_RANK()?
The next row will get rank 3, because DENSE_RANK() does not leave gaps after ties.
Click to reveal answer
intermediate
Why might you choose DENSE_RANK() over RANK()?
Choose DENSE_RANK() when you want continuous ranking numbers without gaps, useful for compact ranking lists.
Click to reveal answer
What happens to the rank numbers after a tie when using RANK()?
AThey skip numbers creating gaps
BThey assign the same rank to all rows
CThey reset to 1
DThey continue without gaps
✗ Incorrect
RANK() skips rank numbers after ties, creating gaps.
Which function assigns ranks without gaps after ties?
ACOUNT()
BROW_NUMBER()
CRANK()
DDENSE_RANK()
✗ Incorrect
DENSE_RANK() assigns ranks without gaps after ties.
If two rows tie for first place, what rank does the next row get with DENSE_RANK()?
A3
B2
C1
D4
✗ Incorrect
DENSE_RANK() assigns the next rank as 2 after two tied rows at rank 1.
Which ranking function can produce gaps in the ranking sequence?
ARANK()
BDENSE_RANK()
CROW_NUMBER()
DSUM()
✗ Incorrect
RANK() produces gaps in ranking numbers after ties.
What is a key difference between RANK() and DENSE_RANK()?
ARANK() assigns unique ranks, DENSE_RANK() does not
BDENSE_RANK() leaves gaps, RANK() does not
CRANK() leaves gaps after ties, DENSE_RANK() does not
DBoth assign ranks randomly
✗ Incorrect
RANK() leaves gaps after ties; DENSE_RANK() assigns consecutive ranks without gaps.
Explain how RANK() and DENSE_RANK() handle ties differently in SQL.
Think about what happens to the next rank number after a tie.
You got /3 concepts.
Describe a scenario where you would prefer to use DENSE_RANK() instead of RANK().
Consider when gaps in ranking numbers might confuse users.
You got /3 concepts.
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
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.
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.
Final Answer:
RANK() skips rank numbers after ties, DENSE_RANK() does not skip numbers. -> Option B
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
Step 1: Identify correct DENSE_RANK() syntax
The correct syntax uses DENSE_RANK() OVER (ORDER BY column) to rank rows based on a column.
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.
Final Answer:
SELECT employee_id, DENSE_RANK() OVER (ORDER BY salary DESC) AS rank FROM employees; -> Option C
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
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.
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).
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
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
Step 1: Check RANK() function usage
RANK() is a window function and must be followed by OVER() clause specifying order.
Step 2: Identify missing OVER() clause
The query uses RANK() without OVER(), causing syntax error.
Final Answer:
Missing OVER() clause after RANK() function. -> Option A
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
Step 1: Understand ranking requirements
Tied salespeople should share the same rank, and the next rank number should not skip any numbers.
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.
Final Answer:
SELECT Salesperson, SalesAmount, DENSE_RANK() OVER (ORDER BY SalesAmount DESC) AS Rank FROM sales; -> Option D
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 unknownstrongwhile earning +1 Grip toward your certificate.