📖 Scenario: You work for a small retail company that tracks daily sales. You want to compare each day's sales with the previous day's sales to see how sales change day by day.
🎯 Goal: Build a SQL query using the LAG function to retrieve the previous day's sales amount alongside the current day's sales.
📋 What You'll Learn
Create a table called daily_sales with columns sale_date (date) and amount (integer).
Insert exactly these rows into daily_sales: ('2024-01-01', 100), ('2024-01-02', 150), ('2024-01-03', 120), ('2024-01-04', 130).
Write a query selecting sale_date, amount, and the previous day's amount using the LAG function.
Order the results by sale_date ascending.
💡 Why This Matters
🌍 Real World
Retail companies often compare daily sales to previous days to understand trends and make decisions.
💼 Career
Knowing how to use window functions like LAG is important for data analysts and database developers to perform time-based comparisons.
Progress0 / 4 steps
1
Create the daily_sales table and insert data
Write SQL statements to create a table called daily_sales with columns sale_date (date) and amount (integer). Then insert these exact rows: ('2024-01-01', 100), ('2024-01-02', 150), ('2024-01-03', 120), ('2024-01-04', 130).
SQL
Hint
Use CREATE TABLE to define the table and INSERT INTO to add rows.
2
Set up the query to select sales data
Write a SQL SELECT statement to get sale_date and amount from the daily_sales table. Do not add the LAG function yet.
SQL
Hint
Use SELECT to choose columns and FROM to specify the table.
3
Add the LAG function to get previous day's sales
Modify the SELECT statement to include LAG(amount) OVER (ORDER BY sale_date) as previous_amount to get the previous row's sales amount.
SQL
Hint
Use LAG(column) OVER (ORDER BY column) to access the previous row's value.
4
Order the results by sale_date
Add an ORDER BY sale_date ASC clause to the query to sort the results by date in ascending order.
SQL
Hint
Use ORDER BY sale_date ASC to sort the output by date from earliest to latest.
Practice
(1/5)
1. What does the SQL LAG function do?
easy
A. Returns the value from the next row in the result set
B. Calculates the sum of all previous rows
C. Returns the value from the previous row in the result set
D. Filters rows based on a condition
Solution
Step 1: Understand the purpose of LAG
The LAG function is used to access data from a previous row relative to the current row in a query result.
Step 2: Compare options with definition
Returns the value from the previous row in the result set correctly states that LAG returns the previous row's value. Other options describe different functions or behaviors.
Final Answer:
Returns the value from the previous row in the result set -> Option C
Quick Check:
LAG = previous row value [OK]
Hint: LAG looks backward one row by default [OK]
Common Mistakes:
Confusing LAG with LEAD (next row)
Thinking LAG sums values
Assuming LAG filters rows
2. Which of the following is the correct syntax to use LAG to get the previous salary ordered by employee ID?
easy
A. LAG(salary) OVER (ORDER BY employee_id)
B. LAG(salary) BY employee_id
C. LAG(salary) ORDER employee_id
D. LAG(salary) PARTITION BY employee_id
Solution
Step 1: Recall LAG syntax
LAG requires an OVER clause with ORDER BY to define the row order for previous row access.
Step 2: Match syntax with options
LAG(salary) OVER (ORDER BY employee_id) correctly uses OVER (ORDER BY employee_id). The other options misuse syntax or keywords.
Final Answer:
LAG(salary) OVER (ORDER BY employee_id) -> Option A
Quick Check:
LAG syntax = LAG() OVER (ORDER BY ...) [OK]
Hint: Always use OVER with ORDER BY for LAG [OK]
Common Mistakes:
Omitting OVER clause
Using PARTITION BY without ORDER BY
Incorrect keyword order
3. Given the table Employees with columns id and salary, what will this query return?
SELECT id, salary, LAG(salary) OVER (ORDER BY id) AS prev_salary FROM Employees;
LAG returns previous row's value or NULL if none [OK]
Hint: First row prev value is always NULL [OK]
Common Mistakes:
Assuming first row has previous value
Mixing up current and previous rows
Ignoring ORDER BY effect
4. Identify the error in this query:
SELECT id, salary, LAG(salary) ORDER BY id AS prev_salary FROM Employees;
medium
A. AS alias must come before LAG
B. ORDER BY cannot be used inside LAG
C. LAG cannot be used with salary column
D. Missing OVER() clause for LAG function
Solution
Step 1: Check LAG function syntax
LAG requires an OVER() clause to specify ordering. The query uses ORDER BY without OVER(), which is invalid.
Step 2: Confirm correct syntax
The correct syntax is LAG(salary) OVER (ORDER BY id). The query misses OVER(), causing a syntax error.
Final Answer:
Missing OVER() clause for LAG function -> Option D
Quick Check:
LAG needs OVER() with ORDER BY [OK]
Hint: LAG always needs OVER() clause [OK]
Common Mistakes:
Using ORDER BY without OVER()
Placing alias before function
Misunderstanding LAG usage
5. You want to find the difference between each employee's salary and the previous employee's salary ordered by id. Which query correctly calculates this difference?
hard
A. SELECT id, salary, LAG(salary) - salary OVER (ORDER BY id) AS diff FROM Employees;
B. SELECT id, salary, salary - LAG(salary) OVER (ORDER BY id) AS diff FROM Employees;
C. SELECT id, salary, salary - LAG(salary) FROM Employees ORDER BY id;
D. SELECT id, salary, salary - LAG(salary) PARTITION BY id AS diff FROM Employees;
Solution
Step 1: Understand the goal
We want to subtract the previous salary from the current salary, ordered by id.
Step 2: Check each option's correctness
SELECT id, salary, salary - LAG(salary) OVER (ORDER BY id) AS diff FROM Employees; correctly uses LAG(salary) OVER (ORDER BY id) and subtracts it from salary. SELECT id, salary, LAG(salary) - salary OVER (ORDER BY id) AS diff FROM Employees; reverses subtraction order. SELECT id, salary, salary - LAG(salary) FROM Employees ORDER BY id; misses OVER clause. SELECT id, salary, salary - LAG(salary) PARTITION BY id AS diff FROM Employees; misuses PARTITION BY without OVER.
Final Answer:
SELECT id, salary, salary - LAG(salary) OVER (ORDER BY id) AS diff FROM Employees; -> Option B
Quick Check:
Difference = current - previous salary using LAG [OK]
Hint: Use LAG with OVER and subtract current minus previous [OK]
Common Mistakes:
Forgetting OVER() clause
Subtracting in wrong order
Misusing PARTITION BY without OVER
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.