📖 Scenario: You work in a sales department and have a table of monthly sales figures for different products. You want to compare each month's sales with the next month's sales to see how sales are changing over time.
🎯 Goal: Build a SQL query that uses the LEAD function to show each product's sales for a month and the sales for the next month side by side.
📋 What You'll Learn
Create a table called monthly_sales with columns product (text), month (integer), and sales (integer).
Insert the exact data rows specified.
Write a query that selects product, month, sales, and the next month's sales using the LEAD function.
Order the results by product and month.
💡 Why This Matters
🌍 Real World
Sales analysts often need to compare current and future sales data to identify trends and make forecasts.
💼 Career
Knowing how to use window functions like LEAD is valuable for data analysts and database developers to write efficient and insightful queries.
Progress0 / 4 steps
1
Create the monthly_sales table and insert data
Create a table called monthly_sales with columns product (text), month (integer), and sales (integer). Then insert these exact rows: ('A', 1, 100), ('A', 2, 120), ('A', 3, 130), ('B', 1, 200), ('B', 2, 210).
SQL
Hint
Use CREATE TABLE to define the table and INSERT INTO with multiple rows to add the data.
2
Add a query to select all columns
Write a SQL query that selects product, month, and sales from the monthly_sales table.
SQL
Hint
Use a simple SELECT statement to get the columns from the table.
3
Use the LEAD function to get next month's sales
Modify the query to also select the next month's sales for the same product using the LEAD function. Name this column next_month_sales. Use PARTITION BY product and ORDER BY month inside the LEAD function.
SQL
Hint
Use the LEAD function with OVER clause specifying PARTITION BY product and ORDER BY month.
4
Order the results by product and month
Add an ORDER BY clause to the query to sort the results by product and then by month in ascending order.
SQL
Hint
Use ORDER BY product, month at the end of the query to sort the results.
Practice
(1/5)
1. What does the SQL LEAD function do in a query?
easy
A. Returns the value from the previous row in the result set
B. Returns the value from the next row in the result set
C. Calculates the sum of values in a column
D. Filters rows based on a condition
Solution
Step 1: Understand LEAD function purpose
The LEAD function is used to access data from the next row relative to the current row without changing the current row position.
Step 2: Compare options with LEAD behavior
Returns the value from the next row in the result set correctly describes this behavior. Options B, C, and D describe other functions or operations.
Final Answer:
Returns the value from the next row in the result set -> Option B
Quick Check:
LEAD = next row value [OK]
Hint: LEAD looks forward one row by default [OK]
Common Mistakes:
Confusing LEAD with LAG (previous row)
Thinking LEAD filters rows
Assuming LEAD sums values
2. Which of the following is the correct syntax to use the LEAD function to get the next row's salary ordered by employee_id?
easy
A. LEAD(salary) OVER (ORDER BY employee_id)
B. LEAD(salary ORDER BY employee_id)
C. LEAD(salary) ORDER BY employee_id
D. LEAD(salary) BY employee_id
Solution
Step 1: Recall LEAD function syntax
The LEAD function requires an OVER clause with an ORDER BY to define the row order for accessing the next row.
Step 2: Match syntax with options
LEAD(salary) OVER (ORDER BY employee_id) correctly uses LEAD(salary) OVER (ORDER BY employee_id). Options A, B, and D have incorrect syntax.
Final Answer:
LEAD(salary) OVER (ORDER BY employee_id) -> Option A
Quick Check:
LEAD + OVER + ORDER BY = correct syntax [OK]
Hint: LEAD needs OVER(ORDER BY ...) syntax [OK]
Common Mistakes:
Omitting OVER clause
Placing ORDER BY inside LEAD parentheses
Using BY instead of ORDER BY
3. Given the table Employees with columns id and salary sorted by id, what will be the output of this query?
SELECT id, salary, LEAD(salary) OVER (ORDER BY id) AS next_salary FROM Employees;
A. [{id:1, salary:5000, next_salary:6000}, {id:2, salary:6000, next_salary:null}, {id:3, salary:5500, next_salary:5500}]
B. [{id:1, salary:5000, next_salary:5500}, {id:2, salary:6000, next_salary:5000}, {id:3, salary:5500, next_salary:6000}]
C. [{id:1, salary:5000, next_salary:null}, {id:2, salary:6000, next_salary:null}, {id:3, salary:5500, next_salary:null}]
D. [{id:1, salary:5000, next_salary:6000}, {id:2, salary:6000, next_salary:5500}, {id:3, salary:5500, next_salary:null}]
Solution
Step 1: Understand LEAD output for each row
LEAD(salary) returns the salary from the next row ordered by id. For id=1, next_salary is salary of id=2 (6000). For id=2, next_salary is salary of id=3 (5500). For id=3, no next row exists, so next_salary is NULL.
Step 2: Match output with options
[{id:1, salary:5000, next_salary:6000}, {id:2, salary:6000, next_salary:5500}, {id:3, salary:5500, next_salary:null}] matches this output exactly. Other options have incorrect next_salary values.
Hint: Next row salary follows order, last row gets NULL [OK]
Common Mistakes:
Mixing up next and previous rows
Expecting last row to have a value
Ignoring ORDER BY in LEAD
4. Identify the error in this SQL query using LEAD:
SELECT id, salary, LEAD(salary, 2) ORDER BY id FROM Employees;
medium
A. salary column does not exist
B. LEAD cannot take a second argument
C. Missing OVER clause with ORDER BY inside LEAD function
D. ORDER BY cannot be used in SELECT clause
Solution
Step 1: Check LEAD function syntax
LEAD requires an OVER clause with ORDER BY to specify row order. The query misses the OVER(...) part.
Step 2: Analyze the query error
ORDER BY is incorrectly placed outside OVER clause and LEAD function lacks OVER clause, causing syntax error.
Final Answer:
Missing OVER clause with ORDER BY inside LEAD function -> Option C
Quick Check:
LEAD needs OVER(ORDER BY ...) [OK]
Hint: LEAD always needs OVER with ORDER BY [OK]
Common Mistakes:
Omitting OVER clause
Placing ORDER BY outside OVER
Assuming LEAD can't take offset argument
5. You want to find each employee's salary and the salary two rows ahead ordered by hire_date. If no such row exists, show 0 instead of NULL. Which query correctly uses LEAD to achieve this?
hard
A. SELECT id, salary, LEAD(salary, 2, 0) OVER (ORDER BY hire_date) AS salary_after_two FROM Employees;
B. SELECT id, salary, LEAD(salary, 0, 2) OVER (ORDER BY hire_date) AS salary_after_two FROM Employees;
C. SELECT id, salary, LEAD(salary, 2) OVER (ORDER BY hire_date) AS salary_after_two FROM Employees WHERE salary_after_two IS NOT NULL;
D. SELECT id, salary, LEAD(salary, 2, NULL) OVER (ORDER BY hire_date) AS salary_after_two FROM Employees;
Solution
Step 1: Understand LEAD parameters
LEAD(column, offset, default) lets you specify how many rows ahead to look and what to return if no row exists.
Step 2: Match query to requirements
SELECT id, salary, LEAD(salary, 2, 0) OVER (ORDER BY hire_date) AS salary_after_two FROM Employees; uses offset 2 and default 0, ordered by hire_date, matching the requirement. SELECT id, salary, LEAD(salary, 0, 2) OVER (ORDER BY hire_date) AS salary_after_two FROM Employees; has wrong offset and default order. SELECT id, salary, LEAD(salary, 2) OVER (ORDER BY hire_date) AS salary_after_two FROM Employees WHERE salary_after_two IS NOT NULL; filters out NULLs instead of replacing. SELECT id, salary, LEAD(salary, 2, NULL) OVER (ORDER BY hire_date) AS salary_after_two FROM Employees; returns NULL instead of 0.
Final Answer:
SELECT id, salary, LEAD(salary, 2, 0) OVER (ORDER BY hire_date) AS salary_after_two FROM Employees; -> Option A
Quick Check:
LEAD with offset 2 and default 0 [OK]
Hint: Use LEAD(column, offset, default) with OVER(ORDER BY ...) [OK]
Common Mistakes:
Swapping offset and default arguments
Filtering NULL instead of setting default
Omitting OVER clause
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.