Bird
Raised Fist0
MySQLquery~5 mins

Window functions (ROW_NUMBER) in MySQL - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What does the ROW_NUMBER() window function do in SQL?
ROW_NUMBER() assigns a unique sequential number to each row within a partition of a result set, starting at 1 for the first row.
Click to reveal answer
beginner
How do you reset the row numbering for each group in a table using ROW_NUMBER()?
Use the PARTITION BY clause inside the OVER() clause to restart numbering for each group.
Click to reveal answer
intermediate
Write a simple SQL query using ROW_NUMBER() to number employees ordered by their salary descending.
SELECT employee_id, salary, ROW_NUMBER() OVER (ORDER BY salary DESC) AS rank FROM employees;
Click to reveal answer
beginner
Can ROW_NUMBER() be used without PARTITION BY? What happens then?
Yes, if PARTITION BY is omitted, ROW_NUMBER() numbers all rows in the entire result set sequentially.
Click to reveal answer
intermediate
Why is ROW_NUMBER() useful compared to using LIMIT or OFFSET for pagination?
ROW_NUMBER() allows numbering rows in a stable order and can be combined with filtering to implement efficient pagination without skipping rows.
Click to reveal answer
What does ROW_NUMBER() return for each row?
AA unique sequential number starting at 1
BThe total count of rows
CThe sum of values in the row
DThe average of values in the partition
Which clause is used with ROW_NUMBER() to restart numbering for each group?
APARTITION BY
BORDER BY
CGROUP BY
DHAVING
What happens if you omit PARTITION BY in ROW_NUMBER()?
AIt causes an error
BRows are grouped by default
CRows are numbered across the entire result set
DRows are numbered randomly
How can ROW_NUMBER() help with pagination?
ABy grouping rows
BBy counting total rows
CBy sorting rows alphabetically
DBy numbering rows to filter specific pages
Which of these is a valid ROW_NUMBER() usage?
AROW_NUMBER() GROUP BY department
BROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC)
CROW_NUMBER() ORDER BY salary
DROW_NUMBER() WHERE salary > 50000
Explain how ROW_NUMBER() works and how you can use PARTITION BY with it.
Think about numbering rows within groups like pages in a book.
You got /4 concepts.
    Describe a real-life scenario where ROW_NUMBER() can help solve a problem.
    Imagine you want to show top salespeople per region.
    You got /4 concepts.

      Practice

      (1/5)
      1. What does the ROW_NUMBER() function do in MySQL window functions?
      easy
      A. Assigns a unique sequential number to each row in the result set.
      B. Calculates the sum of values in a column.
      C. Filters rows based on a condition.
      D. Joins two tables based on a key.

      Solution

      1. Step 1: Understand the purpose of ROW_NUMBER()

        ROW_NUMBER() assigns a unique number to each row in the order specified by ORDER BY.
      2. Step 2: Differentiate from other functions

        It does not sum, filter, or join; it only numbers rows uniquely.
      3. Final Answer:

        Assigns a unique sequential number to each row in the result set. -> Option A
      4. Quick Check:

        ROW_NUMBER() = unique row numbering [OK]
      Hint: ROW_NUMBER() gives each row a unique number in order [OK]
      Common Mistakes:
      • Confusing ROW_NUMBER() with aggregate functions like SUM()
      • Thinking ROW_NUMBER() filters rows
      • Assuming ROW_NUMBER() joins tables
      2. Which of the following is the correct syntax to assign row numbers partitioned by department and ordered by salary DESC?
      easy
      A. ROW_NUMBER(PARTITION BY department ORDER BY salary DESC)
      B. ROW_NUMBER() PARTITION BY department ORDER BY salary DESC
      C. ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC)
      D. ROW_NUMBER() BY department ORDER BY salary DESC

      Solution

      1. Step 1: Recall correct ROW_NUMBER() syntax

        The correct syntax uses OVER() with PARTITION BY and ORDER BY inside parentheses.
      2. Step 2: Identify correct option

        ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) correctly uses ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC).
      3. Final Answer:

        ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) -> Option C
      4. Quick Check:

        Correct syntax includes OVER() with PARTITION BY and ORDER BY [OK]
      Hint: ROW_NUMBER() always needs OVER() with clauses inside [OK]
      Common Mistakes:
      • Omitting OVER() keyword
      • Placing PARTITION BY outside parentheses
      • Using incorrect keywords order
      3. Given the table Employees with columns id, department, salary, what will be the output of this query?
      SELECT id, department, salary, ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn FROM Employees;

      Assuming data:
      id | department | salary
      1 | Sales | 5000
      2 | Sales | 7000
      3 | HR | 6000
      4 | HR | 5500
      medium
      A. [{id:2, department:'Sales', salary:7000, rn:2}, {id:1, department:'Sales', salary:5000, rn:1}, {id:3, department:'HR', salary:6000, rn:2}, {id:4, department:'HR', salary:5500, rn:1}]
      B. [{id:1, department:'Sales', salary:5000, rn:2}, {id:2, department:'Sales', salary:7000, rn:1}, {id:3, department:'HR', salary:6000, rn:1}, {id:4, department:'HR', salary:5500, rn:2}]
      C. [{id:1, department:'Sales', salary:5000, rn:1}, {id:2, department:'Sales', salary:7000, rn:2}, {id:4, department:'HR', salary:5500, rn:1}, {id:3, department:'HR', salary:6000, rn:2}]
      D. [{id:1, department:'Sales', salary:5000, rn:1}, {id:2, department:'Sales', salary:7000, rn:1}, {id:3, department:'HR', salary:6000, rn:1}, {id:4, department:'HR', salary:5500, rn:1}]

      Solution

      1. Step 1: Partition rows by department

        Rows are grouped into Sales and HR departments separately.
      2. Step 2: Order each partition by salary descending and assign row numbers

        Within Sales: id 2 (7000) gets rn=1, id 1 (5000) rn=2; Within HR: id 3 (6000) rn=1, id 4 (5500) rn=2.
      3. Final Answer:

        [{id:1, department:'Sales', salary:5000, rn:2}, {id:2, department:'Sales', salary:7000, rn:1}, {id:3, department:'HR', salary:6000, rn:1}, {id:4, department:'HR', salary:5500, rn:2}] -> Option B
      4. Quick Check:

        Partition by department + order by salary DESC = correct row numbers [OK]
      Hint: Partition groups restart numbering; order controls row number sequence [OK]
      Common Mistakes:
      • Ignoring PARTITION BY and numbering globally
      • Ordering ascending instead of descending
      • Assigning same row number to multiple rows
      4. Identify the error in this query:
      SELECT id, ROW_NUMBER() PARTITION BY department ORDER BY salary FROM Employees;
      medium
      A. Missing OVER() keyword before PARTITION BY clause.
      B. ORDER BY cannot be used inside ROW_NUMBER().
      C. PARTITION BY should be after ORDER BY.
      D. ROW_NUMBER() cannot be used with SELECT.

      Solution

      1. Step 1: Check ROW_NUMBER() syntax

        ROW_NUMBER() requires OVER() before PARTITION BY and ORDER BY clauses.
      2. Step 2: Identify missing OVER()

        The query misses OVER(), causing syntax error.
      3. Final Answer:

        Missing OVER() keyword before PARTITION BY clause. -> Option A
      4. Quick Check:

        ROW_NUMBER() must have OVER() [OK]
      Hint: Always use OVER() with ROW_NUMBER() [OK]
      Common Mistakes:
      • Omitting OVER() keyword
      • Placing PARTITION BY outside OVER()
      • Misordering clauses inside OVER()
      5. You want to select the top 2 highest paid employees per department from the Employees table. Which query correctly uses ROW_NUMBER() to achieve this?
      hard
      A. SELECT id, department, salary, ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn FROM Employees WHERE rn <= 2;
      B. SELECT *, ROW_NUMBER() FROM Employees WHERE rn <= 2 PARTITION BY department ORDER BY salary DESC;
      C. SELECT id, department, salary FROM Employees ORDER BY salary DESC LIMIT 2 PARTITION BY department;
      D. SELECT * FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn FROM Employees) AS t WHERE rn <= 2;

      Solution

      1. Step 1: Use ROW_NUMBER() with PARTITION BY department and ORDER BY salary DESC

        This assigns row numbers restarting at 1 for each department, ordered by salary descending.
      2. Step 2: Filter rows where row number is 2 or less

        Wrap the window function query as a subquery and filter with WHERE rn <= 2 to get top 2 per department.
      3. Final Answer:

        SELECT * FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn FROM Employees) AS t WHERE rn <= 2; -> Option D
      4. Quick Check:

        Use subquery with ROW_NUMBER() and filter rn <= 2 [OK]
      Hint: Use subquery with ROW_NUMBER() and filter rn <= 2 [OK]
      Common Mistakes:
      • Filtering rn in outer query without subquery
      • Using LIMIT with PARTITION BY incorrectly
      • Omitting PARTITION BY causing global numbering
      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