๐ Data Analyst Roadmap โ Part 17
๐ง SQL Level 7 โ Date & Time Functions + Time-Based Analysis
Date and time analysis is one of the most important SQL skills for a Data Analyst.
Real business data is heavily time-dependent:
๐ Monthly revenue
๐ Year-over-year growth
๐ Daily orders
๐ฅ Customer activity
๐ฆ Product demand
โฑ๏ธ Response time
๐ Retention and cohort analysis
To become strong in SQL, you need to know how to extract, filter, compare, group, and calculate differences between dates.
๐น 1. Understanding Date & Time Data Types
โข DATE โ Date only
โข TIME โ Time only
โข DATETIME / TIMESTAMP โ Date + time
๐น 2. Extracting Parts of a Date
๐น 3. Grouping Sales by Year
๐น 4. Grouping Sales by Month
โ ๏ธ Don't group only by month number when data covers multiple years โ Jan 2025 + Jan 2026 would merge incorrectly.
๐น 5. Filtering Data by Date
๐น 6. Why Date Ranges Matter
If
Use half-open range:
๐น 7. Date Difference
Conceptually:
Dialects vary:
๐น 8. Customers Who Took >30 Days to Purchase
๐น 9. Adding / Subtracting Dates
๐น 10. Current Date and Time
๐น 11. Recent Orders (Last 30 Days)
๐น 12. Year-over-Year Analysis
Formula:
In SQL:
๐น 13. Month-over-Month Growth
๐น 14. Quarter Analysis
๐น 15. First and Last Transaction
๐ง SQL Level 7 โ Date & Time Functions + Time-Based Analysis
Date and time analysis is one of the most important SQL skills for a Data Analyst.
Real business data is heavily time-dependent:
๐ Monthly revenue
๐ Year-over-year growth
๐ Daily orders
๐ฅ Customer activity
๐ฆ Product demand
โฑ๏ธ Response time
๐ Retention and cohort analysis
To become strong in SQL, you need to know how to extract, filter, compare, group, and calculate differences between dates.
๐น 1. Understanding Date & Time Data Types
โข DATE โ Date only
โข TIME โ Time only
โข DATETIME / TIMESTAMP โ Date + time
Order_Date: 2026-01-15
Order_Timestamp: 2026-01-15 14:35:20
๐น 2. Extracting Parts of a Date
SELECT
Order_Date,
EXTRACT(YEAR FROM Order_Date) AS Order_Year,
EXTRACT(MONTH FROM Order_Date) AS Order_Month
FROM Orders;
๐น 3. Grouping Sales by Year
SELECT
EXTRACT(YEAR FROM Order_Date) AS Order_Year,
SUM(Sales) AS Total_Sales
FROM Orders
GROUP BY EXTRACT(YEAR FROM Order_Date)
ORDER BY Order_Year;
๐น 4. Grouping Sales by Month
SELECT
EXTRACT(YEAR FROM Order_Date) AS Order_Year,
EXTRACT(MONTH FROM Order_Date) AS Order_Month,
SUM(Sales) AS Total_Sales
FROM Orders
GROUP BY
EXTRACT(YEAR FROM Order_Date),
EXTRACT(MONTH FROM Order_Date)
ORDER BY Order_Year, Order_Month;
โ ๏ธ Don't group only by month number when data covers multiple years โ Jan 2025 + Jan 2026 would merge incorrectly.
๐น 5. Filtering Data by Date
SELECT * FROM Orders
WHERE Order_Date >= '2026-01-01'
AND Order_Date < '2026-02-01';
๐น 6. Why Date Ranges Matter
If
Order_Timestamp = 2026-01-31 23:30:00, thenWHERE Order_Timestamp <= '2026-01-31' will miss it.Use half-open range:
WHERE Order_Timestamp >= '2026-01-01'
AND Order_Timestamp < '2026-02-01'
๐น 7. Date Difference
Conceptually:
Date_Difference(First_Purchase_Date, Signup_Date)Dialects vary:
DATEDIFF(), DATE_DIFF(), subtraction, etc.๐น 8. Customers Who Took >30 Days to Purchase
SELECT Customer_ID, Signup_Date, First_Purchase_Date
FROM Customers
WHERE DATEDIFF(day, Signup_Date, First_Purchase_Date) > 30;
๐น 9. Adding / Subtracting Dates
Signup_Date + INTERVAL '30' DAY -- 30 days after signup
Order_Date - INTERVAL '7' DAY -- 7 days before order
๐น 10. Current Date and Time
CURRENT_DATE, CURRENT_TIMESTAMP โ useful for today's sales, active subs, overdue orders.๐น 11. Recent Orders (Last 30 Days)
SELECT * FROM Orders
WHERE Order_Date >= CURRENT_DATE - INTERVAL '30' DAY;
๐น 12. Year-over-Year Analysis
Formula:
(Current - Previous) / Previous * 100In SQL:
LAG(Sales) OVER (ORDER BY Year)
๐น 13. Month-over-Month Growth
WITH Monthly_Sales AS (
SELECT
EXTRACT(YEAR FROM Order_Date) AS Year,
EXTRACT(MONTH FROM Order_Date) AS Month,
SUM(Sales) AS Total_Sales
FROM Orders
GROUP BY 1, 2
)
SELECT
Year, Month, Total_Sales,
LAG(Total_Sales) OVER (ORDER BY Year, Month) AS Previous_Month_Sales
FROM Monthly_Sales;
๐น 14. Quarter Analysis
EXTRACT(QUARTER FROM Order_Date)
-- Q1: Jan-Mar, Q2: Apr-Jun, Q3: Jul-Sep, Q4: Oct-Dec
๐น 15. First and Last Transaction
ROW_NUMBER() OVER (
PARTITION BY Customer_ID
ORDER BY Order_Date
)
-- rn = 1 is first transaction
โค4
๐น 16. Days Between Purchases
๐น 17. Finding Inactive Customers
๐น 18. Common Mistake
Avoid:
Prefer: Range filter โ it's clearer and index-friendly.
๐ผ Real-World Applications
โ Monthly revenue, daily sales, YoY/MoM growth, retention, churn, purchase frequency, cohort, subscription expiry
๐ฏ SQL Interview Challenge: Find each customer's most recent order
๐ก Double Tap โค๏ธ For More
SELECT
Customer_ID, Order_Date,
LAG(Order_Date) OVER (PARTITION BY Customer_ID ORDER BY Order_Date) AS Previous_Order_Date
FROM Orders;
-- Then: Current - Previous
๐น 17. Finding Inactive Customers
SELECT Customer_ID, MAX(Order_Date) AS Last_Order_Date
FROM Orders
GROUP BY Customer_ID;
-- Compare with CURRENT_DATE for 90-day inactivity
๐น 18. Common Mistake
Avoid:
WHERE YEAR(Order_Date) = 2026Prefer: Range filter โ it's clearer and index-friendly.
๐ผ Real-World Applications
โ Monthly revenue, daily sales, YoY/MoM growth, retention, churn, purchase frequency, cohort, subscription expiry
๐ฏ SQL Interview Challenge: Find each customer's most recent order
WITH Ranked_Orders AS (
SELECT
Customer_ID, Order_ID, Order_Date,
ROW_NUMBER() OVER (PARTITION BY Customer_ID ORDER BY Order_Date DESC) AS rn
FROM Orders
)
SELECT Customer_ID, Order_ID, Order_Date
FROM Ranked_Orders
WHERE rn = 1;
๐ก Double Tap โค๏ธ For More
โค11
๐ ๐ ๐ฎ๐๐๐ฒ๐ฟ ๐๐ป-๐๐ฒ๐บ๐ฎ๐ป๐ฑ ๐ง๐ฒ๐ฐ๐ต ๐ฆ๐ธ๐ถ๐น๐น๐ ๐ณ๐ผ๐ฟ ๐๐ฅ๐๐ ๐ถ๐ป ๐ฎ๐ฌ๐ฎ๐ฒ ๐ฅ
Want to upgrade your tech skills without spending money?
Here are some excellent FREE YouTube resources to learn high-demand technologies through tutorials and hands-on practice.
๐ฅ Learn โ Practice โ Build Projects โ Upgrade Your Resume
๐ ๐๐ป๐ฟ๐ผ๐น๐น ๐ณ๐ผ๐ฟ ๐๐ฅ๐๐ ๐:-
https://pdlink.in/4x3B9hb
๐ฏ Perfect for Students โข Freshers โข Job Seekers โข Working Professionals
Want to upgrade your tech skills without spending money?
Here are some excellent FREE YouTube resources to learn high-demand technologies through tutorials and hands-on practice.
๐ฅ Learn โ Practice โ Build Projects โ Upgrade Your Resume
๐ ๐๐ป๐ฟ๐ผ๐น๐น ๐ณ๐ผ๐ฟ ๐๐ฅ๐๐ ๐:-
https://pdlink.in/4x3B9hb
๐ฏ Perfect for Students โข Freshers โข Job Seekers โข Working Professionals
โค2๐2
Starting as a data analyst is a great first step in your career. As you grow, you might discover new interests:
โข If you love working with statistics and machine learning, you could move into Data Science.
โข If you're excited by building data systems and pipelines, Data Engineering might be your next step.
โข If you're more interested in understanding the business side, you could become a Business Analyst.
Even if you decide to stay in your data analyst role, there's always something new to learn, especially with advancements in AI.
There are many paths to explore, but what's important is taking that first step.
โข If you love working with statistics and machine learning, you could move into Data Science.
โข If you're excited by building data systems and pipelines, Data Engineering might be your next step.
โข If you're more interested in understanding the business side, you could become a Business Analyst.
Even if you decide to stay in your data analyst role, there's always something new to learn, especially with advancements in AI.
There are many paths to explore, but what's important is taking that first step.
โค9
๐ ๐๐ฅ๐๐ ๐๐ถ๐๐ถ ๐ฉ๐ถ๐ฟ๐๐๐ฎ๐น ๐๐ฒ๐ฟ๐๐ถ๐ณ๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป ๐ฃ๐ฟ๐ผ๐ด๐ฟ๐ฎ๐บ๐ ๐ | Boost Your Resume
Citi offers virtual experience programs designed to help students and freshers develop job-ready skills through real-world tasks.
โ 100% FREE
โ Self-paced learning
โ Real-world projects
โ Certificate on completion
โ Add the experience to your Resume & LinkedIn
๐ ๐๐ป๐ฟ๐ผ๐น๐น ๐ณ๐ผ๐ฟ ๐๐ฅ๐๐ ๐:-
https://pdlink.in/4zZqJ4U
๐ฅ Learn โ Complete Projects โ Earn Certificate โ Strengthen Your Resume
Citi offers virtual experience programs designed to help students and freshers develop job-ready skills through real-world tasks.
โ 100% FREE
โ Self-paced learning
โ Real-world projects
โ Certificate on completion
โ Add the experience to your Resume & LinkedIn
๐ ๐๐ป๐ฟ๐ผ๐น๐น ๐ณ๐ผ๐ฟ ๐๐ฅ๐๐ ๐:-
https://pdlink.in/4zZqJ4U
๐ฅ Learn โ Complete Projects โ Earn Certificate โ Strengthen Your Resume
โค6
๐ Data Analyst Roadmap โ Part 18
๐ง SQL Level 8 โ Advanced Analytical Queries & Business Problems
At this stage, you know the core SQL building blocks:
โข SELECT โ WHERE โ GROUP BY โ HAVING โ JOIN โ CTE โ Window Functions โ Date Analysis
Now it's time to combine them.
Real Data Analyst work rarely asks:
โWrite a query using RANK().โ
Instead, you'll get business questions like:
โข Which customers are becoming inactive?
โข What are our top-selling products in each category?
โข
Which month had the highest revenue growth?
โข
The real skill is converting a business problem into SQL logic.
๐น 1. Start With the Business Question
Before writing SQL, identify:
โข What are we measuring?
โข At what level?
โข Which tables contain the required data?
โข What filters are needed?
โข Do we need aggregation?
โข Do we need ranking or comparison?
For example: โFind the top 3 products in every category.โ
Break it down:
โข Product โ Category โ Sales โ Rank within Category โ Keep Top 3
โข This approach prevents complicated SQL from becoming confusing.
๐น 2. Find the Correct Grain
One of the most important analytical concepts is grain.
Grain means: What does one row represent?
For example:
โข Orders โ one row per order
โข Order_Items โ one row per product within an order
โข
Customers โ one row per customer
โข
If you don't understand the grain, you can accidentally double-count revenue.
๐น 3. Revenue by Customer
Suppose you have:
Customers
โข Customer_ID
โข Customer_Name
and Orders
โข Order_ID
โข Customer_ID
โข Order_Date
โข Sales
You can calculate customer revenue:
โข Now you have one row per customer.
๐น 4. Rank Customers by Revenue
Combine aggregation with a window function:
โข This answers: Who are our highest-value customers?
๐น 5. Top 3 Customers in Each Region
Now add another business dimension.
โข This is a classic advanced SQL interview problem.
๐น 6. Finding the Second-Highest Salary
A common interview question.
โข Using DENSE_RANK() is useful when multiple employees share the same salary.
๐น 7. Find Products That Never Sold
This is a classic LEFT JOIN problem.
Business interpretation: Products exist in the catalog but have no sales.
This could indicate:
โข Poor demand
โข Pricing problems
โข Inventory issues
โข Product visibility problems
๐น 8. Customers With No Orders
The same logic can identify customers who have never purchased.
๐ง SQL Level 8 โ Advanced Analytical Queries & Business Problems
At this stage, you know the core SQL building blocks:
โข SELECT โ WHERE โ GROUP BY โ HAVING โ JOIN โ CTE โ Window Functions โ Date Analysis
Now it's time to combine them.
Real Data Analyst work rarely asks:
โWrite a query using RANK().โ
Instead, you'll get business questions like:
โข Which customers are becoming inactive?
โข What are our top-selling products in each category?
โข
Which month had the highest revenue growth?
โข
The real skill is converting a business problem into SQL logic.
๐น 1. Start With the Business Question
Before writing SQL, identify:
โข What are we measuring?
โข At what level?
โข Which tables contain the required data?
โข What filters are needed?
โข Do we need aggregation?
โข Do we need ranking or comparison?
For example: โFind the top 3 products in every category.โ
Break it down:
โข Product โ Category โ Sales โ Rank within Category โ Keep Top 3
โข This approach prevents complicated SQL from becoming confusing.
๐น 2. Find the Correct Grain
One of the most important analytical concepts is grain.
Grain means: What does one row represent?
For example:
โข Orders โ one row per order
โข Order_Items โ one row per product within an order
โข
Customers โ one row per customer
โข
If you don't understand the grain, you can accidentally double-count revenue.
๐น 3. Revenue by Customer
Suppose you have:
Customers
โข Customer_ID
โข Customer_Name
and Orders
โข Order_ID
โข Customer_ID
โข Order_Date
โข Sales
You can calculate customer revenue:
SELECT
c.Customer_ID,
c.Customer_Name,
SUM(o.Sales) AS Total_Sales
FROM Customers c
JOIN Orders o
ON c.Customer_ID = o.Customer_ID
GROUP BY
c.Customer_ID,
c.Customer_Name;
โข Now you have one row per customer.
๐น 4. Rank Customers by Revenue
Combine aggregation with a window function:
WITH Customer_Sales AS (
SELECT
Customer_ID,
SUM(Sales) AS Total_Sales
FROM Orders
GROUP BY Customer_ID
)
SELECT
Customer_ID,
Total_Sales,
RANK() OVER (ORDER BY Total_Sales DESC) AS Sales_Rank
FROM Customer_Sales;
โข This answers: Who are our highest-value customers?
๐น 5. Top 3 Customers in Each Region
Now add another business dimension.
WITH Customer_Sales AS (
SELECT Customer_ID, Region, SUM(Sales) AS Total_Sales
FROM Orders
GROUP BY Customer_ID, Region
),
Ranked_Customers AS (
SELECT
Customer_ID, Region, Total_Sales,
RANK() OVER (PARTITION BY Region ORDER BY Total_Sales DESC) AS Sales_Rank
FROM Customer_Sales
)
SELECT * FROM Ranked_Customers WHERE Sales_Rank <= 3;
โข This is a classic advanced SQL interview problem.
๐น 6. Finding the Second-Highest Salary
A common interview question.
WITH Ranked_Employees AS (
SELECT Employee, Salary,
DENSE_RANK() OVER (ORDER BY Salary DESC) AS Salary_Rank
FROM Employees
)
SELECT Employee, Salary FROM Ranked_Employees WHERE Salary_Rank = 2;
โข Using DENSE_RANK() is useful when multiple employees share the same salary.
๐น 7. Find Products That Never Sold
This is a classic LEFT JOIN problem.
SELECT p.Product_ID, p.Product_Name
FROM Products p
LEFT JOIN Order_Items oi ON p.Product_ID = oi.Product_ID
WHERE oi.Product_ID IS NULL;
Business interpretation: Products exist in the catalog but have no sales.
This could indicate:
โข Poor demand
โข Pricing problems
โข Inventory issues
โข Product visibility problems
๐น 8. Customers With No Orders
The same logic can identify customers who have never purchased.
SELECT c.Customer_ID, c.Customer_Name
FROM Customers c
LEFT JOIN Orders o ON c.Customer_ID = o.Customer_ID
WHERE o.Customer_ID IS NULL;
โค6
โข This can help marketing teams identify potential customers who need activation campaigns.
๐น 9. Customers Above Average Spending
First calculate customer totals. Then compare them with the overall average.
โข Notice how concepts from earlier parts work together: CTE + Aggregation + Subquery
๐น 10. Month-over-Month Sales Growth
First aggregate sales by month. Then use LAG().
โข This produces a time-based comparison instead of just a total.
๐น 11. Calculate Growth Percentage
You can extend the previous query:
โข NULLIF() is important because it prevents division-by-zero errors.
โข A practical analyst must always think about edge cases.
๐น 12. Find the Latest Order for Every Customer
From Part 17, combine PARTITION BY + ORDER BY + ROW_NUMBER()
This is useful for:
โข Customer activity
โข Churn analysis
โข Last purchase reporting
โข CRM segmentation
๐น 13. Identify Potentially Inactive Customers
First find the last purchase date:
Then compare the last order against a chosen inactivity threshold.
โข The business rule might be: No purchase for 90 days โ Potentially inactive
โข The important lesson: SQL provides the calculation. The business defines what "inactive" means.
๐น 14. Find Duplicate Records
Window functions are excellent for detecting duplicates.
โข These records can then be investigated before cleaning the dataset.
๐น 15. Combining Multiple Tables
Real analysis often requires several joins.
For example: Customers โ Orders โ Order_Items โ Products
๐น 9. Customers Above Average Spending
First calculate customer totals. Then compare them with the overall average.
WITH Customer_Sales AS (
SELECT Customer_ID, SUM(Sales) AS Total_Sales FROM Orders GROUP BY Customer_ID
)
SELECT Customer_ID, Total_Sales
FROM Customer_Sales
WHERE Total_Sales > (SELECT AVG(Total_Sales) FROM Customer_Sales);
โข Notice how concepts from earlier parts work together: CTE + Aggregation + Subquery
๐น 10. Month-over-Month Sales Growth
First aggregate sales by month. Then use LAG().
WITH Monthly_Sales AS (
SELECT EXTRACT(YEAR FROM Order_Date) AS Year,
EXTRACT(MONTH FROM Order_Date) AS Month,
SUM(Sales) AS Total_Sales
FROM Orders
GROUP BY EXTRACT(YEAR FROM Order_Date), EXTRACT(MONTH FROM Order_Date)
),
Comparison AS (
SELECT Year, Month, Total_Sales,
LAG(Total_Sales) OVER (ORDER BY Year, Month) AS Previous_Sales
FROM Monthly_Sales
)
SELECT Year, Month, Total_Sales, Previous_Sales, Total_Sales - Previous_Sales AS Sales_Change
FROM Comparison;
โข This produces a time-based comparison instead of just a total.
๐น 11. Calculate Growth Percentage
You can extend the previous query:
(Total_Sales - Previous_Sales) / NULLIF(Previous_Sales, 0) * 100
โข NULLIF() is important because it prevents division-by-zero errors.
โข A practical analyst must always think about edge cases.
๐น 12. Find the Latest Order for Every Customer
From Part 17, combine PARTITION BY + ORDER BY + ROW_NUMBER()
WITH Ranked_Orders AS (
SELECT Customer_ID, Order_ID, Order_Date,
ROW_NUMBER() OVER (PARTITION BY Customer_ID ORDER BY Order_Date DESC) AS rn
FROM Orders
)
SELECT Customer_ID, Order_ID, Order_Date FROM Ranked_Orders WHERE rn = 1;
This is useful for:
โข Customer activity
โข Churn analysis
โข Last purchase reporting
โข CRM segmentation
๐น 13. Identify Potentially Inactive Customers
First find the last purchase date:
SELECT Customer_ID, MAX(Order_Date) AS Last_Order_Date FROM Orders GROUP BY Customer_ID;
Then compare the last order against a chosen inactivity threshold.
โข The business rule might be: No purchase for 90 days โ Potentially inactive
โข The important lesson: SQL provides the calculation. The business defines what "inactive" means.
๐น 14. Find Duplicate Records
Window functions are excellent for detecting duplicates.
WITH Duplicate_Check AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY Customer_ID, Order_Date, Sales ORDER BY Order_ID) AS rn
FROM Orders
)
SELECT * FROM Duplicate_Check WHERE rn > 1;
โข These records can then be investigated before cleaning the dataset.
๐น 15. Combining Multiple Tables
Real analysis often requires several joins.
For example: Customers โ Orders โ Order_Items โ Products
SELECT c.Customer_ID, c.Customer_Name, p.Product_Name, oi.Quantity, oi.Sales
FROM Customers c
JOIN Orders o ON c.Customer_ID = o.Customer_ID
JOIN Order_Items oi ON o.Order_ID = oi.Order_ID
JOIN Products p ON oi.Product_ID = p.Product_ID;
โค3
โ ๏ธ Every additional join can change the number of rows.
โข Always check whether the resulting grain is still what you expect.
๐น 16. The Most Important Analytical Pattern
Many advanced SQL problems can be solved using this structure:
โข
1. Filter the raw data โ 2. Join required tables โ 3. Aggregate to the correct grain โ 4. Apply window functions โ 5. Filter the analytical result โ 6. Present the final output
For example:
โข Orders โ Filter โ GROUP BY Customer โ Calculate Sales โ RANK() โ Keep Top 3 โ Final Report
โข Learning this thought process is more valuable than memorizing individual queries.
๐ผ Real-World Business Problems You Should Practice
Sales
โ Top 5 products by revenue
โ Top products within each category
โ Month with highest sales
โ Revenue growth by month
โ Customers contributing most revenue
Customers
โ Customers with no orders
โ Customers with declining purchases
โ Most recent purchase per customer
โ Repeat customers
โ Average order value per customer
Operations
โ Orders taking longer than expected
โ Products never sold
โ Duplicate transactions
โ Most active regions
โ Employees with above-average performance
๐ฏ SQL Interview Challenge
Question: Find the highest-selling product in each category.
Think about the problem before writing the query:
โข Product โ Category โ Total Sales โ Rank Within Category โ Keep Rank 1
A possible solution:
๐ก Double Tap โค๏ธ For More
โข Always check whether the resulting grain is still what you expect.
๐น 16. The Most Important Analytical Pattern
Many advanced SQL problems can be solved using this structure:
โข
1. Filter the raw data โ 2. Join required tables โ 3. Aggregate to the correct grain โ 4. Apply window functions โ 5. Filter the analytical result โ 6. Present the final output
For example:
โข Orders โ Filter โ GROUP BY Customer โ Calculate Sales โ RANK() โ Keep Top 3 โ Final Report
โข Learning this thought process is more valuable than memorizing individual queries.
๐ผ Real-World Business Problems You Should Practice
Sales
โ Top 5 products by revenue
โ Top products within each category
โ Month with highest sales
โ Revenue growth by month
โ Customers contributing most revenue
Customers
โ Customers with no orders
โ Customers with declining purchases
โ Most recent purchase per customer
โ Repeat customers
โ Average order value per customer
Operations
โ Orders taking longer than expected
โ Products never sold
โ Duplicate transactions
โ Most active regions
โ Employees with above-average performance
๐ฏ SQL Interview Challenge
Question: Find the highest-selling product in each category.
Think about the problem before writing the query:
โข Product โ Category โ Total Sales โ Rank Within Category โ Keep Rank 1
A possible solution:
WITH Product_Sales AS (
SELECT Product_ID, Category, SUM(Sales) AS Total_Sales
FROM Product_Sales_Data
GROUP BY Product_ID, Category
),
Ranked_Products AS (
SELECT Product_ID, Category, Total_Sales,
RANK() OVER (PARTITION BY Category ORDER BY Total_Sales DESC) AS Sales_Rank
FROM Product_Sales
)
SELECT Product_ID, Category, Total_Sales FROM Ranked_Products WHERE Sales_Rank = 1;
๐ก Double Tap โค๏ธ For More
โค9
๐ ๐๐ฅ๐๐ ๐ฅ๐ฒ๐๐ผ๐๐ฟ๐ฐ๐ฒ๐ ๐๐ผ ๐๐ฒ๐ฎ๐ฟ๐ป ๐๐ฎ๐๐ฎ ๐๐ป๐ฎ๐น๐๐๐ถ๐ฐ๐ ๐
Want to build a career in Data Analytics but donโt know where to start? Learn the most important skills completely FREE with these expert YouTube resources.
๐ฅ Learn โ Practice โ Build Projects โ Become Job-Ready
๐ ๐๐ป๐ฟ๐ผ๐น๐น ๐ณ๐ผ๐ฟ ๐๐ฅ๐๐ ๐:-
https://pdlink.in/4ysm4XS
๐ฏ Perfect for Students โข Freshers โข Job Seekers โข Aspiring Data Analysts
Want to build a career in Data Analytics but donโt know where to start? Learn the most important skills completely FREE with these expert YouTube resources.
๐ฅ Learn โ Practice โ Build Projects โ Become Job-Ready
๐ ๐๐ป๐ฟ๐ผ๐น๐น ๐ณ๐ผ๐ฟ ๐๐ฅ๐๐ ๐:-
https://pdlink.in/4ysm4XS
๐ฏ Perfect for Students โข Freshers โข Job Seekers โข Aspiring Data Analysts
โค4
๐ ๐ง๐๐ง๐ ๐๐ฟ๐ผ๐๐ฝ ๐๐ฅ๐๐ ๐ฉ๐ถ๐ฟ๐๐๐ฎ๐น ๐๐ป๐๐ฒ๐ฟ๐ป๐๐ต๐ถ๐ฝ ๐ฃ๐ฟ๐ผ๐ด๐ฟ๐ฎ๐บ๐ ๐
Tata Group/TCS virtual job simulations let you work through industry-style tasks and strengthen your resume.
๐ 3 FREE Virtual Programs:
๐ Data Visualisation
๐ Cybersecurity
๐ฑ ESG (Environmental, Social & Governance)
๐ป Virtual & flexible
๐ Free Certificate on Completion
๐ Add the experience to your Resume/LinkedIn
๐ ๐๐ป๐ฟ๐ผ๐น๐น ๐ณ๐ผ๐ฟ ๐๐ฅ๐๐ ๐:-
https://pdlink.in/4yoXEOI
๐ฅ Perfect for Students โข Freshers โข Job Seekers
Tata Group/TCS virtual job simulations let you work through industry-style tasks and strengthen your resume.
๐ 3 FREE Virtual Programs:
๐ Data Visualisation
๐ Cybersecurity
๐ฑ ESG (Environmental, Social & Governance)
๐ป Virtual & flexible
๐ Free Certificate on Completion
๐ Add the experience to your Resume/LinkedIn
๐ ๐๐ป๐ฟ๐ผ๐น๐น ๐ณ๐ผ๐ฟ ๐๐ฅ๐๐ ๐:-
https://pdlink.in/4yoXEOI
๐ฅ Perfect for Students โข Freshers โข Job Seekers
๐ Data Analyst Roadmap โ Part 19
๐ง SQL Level 9 โ Query Performance & Optimization
Knowing how to write a SQL query is one skill. Knowing how to write a query that is correct, efficient, scalable, and easy to maintain is another.
As a Data Analyst, you may eventually work with tables containing:
๐ Millions of rows
๐ฆ Large transaction datasets
๐ฅ Millions of customers
๐ Years of historical data
A query that works perfectly on 10,000 rows may become extremely slow on 100 million rows. That's why understanding SQL performance matters.
๐น 1. What Is Query Optimization?
Query optimization means improving a query so that it:
โ Returns the correct result
โ Uses fewer resources
โ Processes less unnecessary data
โ Executes faster
โ Scales better as data grows
๐น 2. Select Only the Columns You Need
Avoid:
when you only need:
โข Read unnecessary columns
โข Increase data transfer
โข Make queries harder to maintain
โข Become problematic when tables change
For analytical work, explicitly selecting required columns is usually better.
๐น 3. Filter Data Early
Suppose you only need 2026 orders:
Filtering reduces the amount of data that later operations need to process.
๐น 4. Understand Indexes
An index is a database structure that can help locate rows more efficiently. Think of it like the index of a book.
Without an index: Database โ potentially scan many rows
With a useful index: Database โ locate relevant data more efficiently
Indexes can be especially useful for columns frequently used in:
Example:
โ ๏ธ Index syntax and behavior vary by database.
๐น 5. Indexes Are Not Always Better
Indexes have costs. They can:
Consume storage, slow down
Therefore:
Don't create indexes on every column. Database systems and workloads determine which indexes are useful.
๐น 6. Index Columns Used for JOINs
The join depends on:
Appropriate indexing can improve join performance, especially for large tables. But the database optimizer decides whether an index actually provides a benefit.
๐น 7. Avoid Functions on Filtered Columns When Possible
Consider:
A range condition is often preferable:
Why?
Applying a function to every row can make it harder for some database systems to use an index efficiently. This is called maintaining sargability.
๐น 8. What Is Sargability?
A condition is generally considered sargable when the database can efficiently use an index to find matching rows.
Compare:
with:
The first form usually gives the optimizer more opportunity to use an index on
๐น 9. Use "EXPLAIN"
One of the most important tools for understanding query performance is:
๐ง SQL Level 9 โ Query Performance & Optimization
Knowing how to write a SQL query is one skill. Knowing how to write a query that is correct, efficient, scalable, and easy to maintain is another.
As a Data Analyst, you may eventually work with tables containing:
๐ Millions of rows
๐ฆ Large transaction datasets
๐ฅ Millions of customers
๐ Years of historical data
A query that works perfectly on 10,000 rows may become extremely slow on 100 million rows. That's why understanding SQL performance matters.
๐น 1. What Is Query Optimization?
Query optimization means improving a query so that it:
โ Returns the correct result
โ Uses fewer resources
โ Processes less unnecessary data
โ Executes faster
โ Scales better as data grows
๐น 2. Select Only the Columns You Need
Avoid:
SELECT * FROM Orders;
when you only need:
SELECT Order_ID, Customer_ID, Sales FROM Orders;
SELECT * can:โข Read unnecessary columns
โข Increase data transfer
โข Make queries harder to maintain
โข Become problematic when tables change
For analytical work, explicitly selecting required columns is usually better.
๐น 3. Filter Data Early
Suppose you only need 2026 orders:
SELECT Customer_ID, SUM(Sales) AS Total_Sales
FROM Orders
WHERE Order_Date >= '2026-01-01'
AND Order_Date < '2027-01-01'
GROUP BY Customer_ID;
Filtering reduces the amount of data that later operations need to process.
๐น 4. Understand Indexes
An index is a database structure that can help locate rows more efficiently. Think of it like the index of a book.
Without an index: Database โ potentially scan many rows
With a useful index: Database โ locate relevant data more efficiently
Indexes can be especially useful for columns frequently used in:
WHERE, JOIN, ORDER BY, and sometimes GROUP BY.Example:
CREATE INDEX idx_orders_customer ON Orders(Customer_ID);
โ ๏ธ Index syntax and behavior vary by database.
๐น 5. Indexes Are Not Always Better
Indexes have costs. They can:
Consume storage, slow down
INSERT, UPDATE, DELETE, and require maintenance.Therefore:
Don't create indexes on every column. Database systems and workloads determine which indexes are useful.
๐น 6. Index Columns Used for JOINs
SELECT c.Customer_Name, o.Sales
FROM Customers c
JOIN Orders o ON c.Customer_ID = o.Customer_ID;
The join depends on:
Customer_ID.Appropriate indexing can improve join performance, especially for large tables. But the database optimizer decides whether an index actually provides a benefit.
๐น 7. Avoid Functions on Filtered Columns When Possible
Consider:
WHERE YEAR(Order_Date) = 2026
A range condition is often preferable:
WHERE Order_Date >= '2026-01-01' AND Order_Date < '2027-01-01'
Why?
Applying a function to every row can make it harder for some database systems to use an index efficiently. This is called maintaining sargability.
๐น 8. What Is Sargability?
A condition is generally considered sargable when the database can efficiently use an index to find matching rows.
Compare:
WHERE Order_Date >= '2026-01-01'
with:
WHERE YEAR(Order_Date) = 2026
The first form usually gives the optimizer more opportunity to use an index on
Order_Date.๐น 9. Use "EXPLAIN"
One of the most important tools for understanding query performance is:
EXPLAIN
SELECT * FROM Orders WHERE Customer_ID = 1001;
โค2
Depending on the database, you may also see:
These tools can show how the database plans to execute or actually executes the query.
You may encounter concepts such as: Table scan, Index scan, Index seek, Join strategy, Sort, Aggregate, Estimated rows, Actual rows, Execution cost.
๐น 10. Table Scan vs Index Access
A table scan may require reading a large portion of a table. An index-based access path can sometimes locate matching records much more efficiently.
But: โ ๏ธ A table scan is not automatically bad.
If you need most of the table, scanning it may actually be the best strategy.
The optimizer chooses based on: Data size + statistics + indexes + query conditions + database engine.
๐น 11. Avoid Unnecessary "DISTINCT"
This query:
may be perfectly valid.
But don't use
๐น 12. Be Careful With JOIN Multiplication
Suppose:
Customer A โ 10 Orders and each order has 5 Order Items
Joining
If you then calculate:
This is a logic problem, not just a performance problem. Always understand the grain before joining and aggregating.
๐น 13. "UNION" vs "UNION ALL"
"UNION" removes duplicates.
"UNION ALL" simply combines the results:
If you don't need duplicate removal,
๐น 14. Avoid Repeating Expensive Logic
Suppose the same complex calculation appears multiple times.
Instead of repeating it, consider using: CTEs, Derived tables, Temporary tables, Views, Pre-aggregated tables.
The objective is: Calculate expensive logic only when necessary.
๐น 15. CTEs and Performance
CTEs make SQL much easier to organize:
A CTE is primarily a query organization technique. Whether it improves performance depends on the database engine, query structure, materialization behavior, and optimizer.
๐น 16. Reduce Data Before Expensive Operations
A useful analytical pattern is:
Raw Data โ Filter โ Select Required Columns โ Join โ Aggregate โ Window Function โ Final Result
The exact optimal order depends on the query, but the principle is: Don't process more data than necessary.
๐น 17. Avoid Correlated Subqueries When a Better Approach Exists
A correlated subquery may conceptually execute in relation to each outer row:
Sometimes a CTE + join or window function can express the same business logic more efficiently:
EXPLAIN ANALYZE
These tools can show how the database plans to execute or actually executes the query.
You may encounter concepts such as: Table scan, Index scan, Index seek, Join strategy, Sort, Aggregate, Estimated rows, Actual rows, Execution cost.
๐น 10. Table Scan vs Index Access
A table scan may require reading a large portion of a table. An index-based access path can sometimes locate matching records much more efficiently.
But: โ ๏ธ A table scan is not automatically bad.
If you need most of the table, scanning it may actually be the best strategy.
The optimizer chooses based on: Data size + statistics + indexes + query conditions + database engine.
๐น 11. Avoid Unnecessary "DISTINCT"
This query:
SELECT DISTINCT Customer_ID FROM Orders;
may be perfectly valid.
But don't use
DISTINCT simply to hide duplicate rows created by an incorrect join.๐น 12. Be Careful With JOIN Multiplication
Suppose:
Customer A โ 10 Orders and each order has 5 Order Items
Joining
customers โ orders โ order items can produce many rows. If you then calculate:
SUM(Order_Sales) you could accidentally multiply the order-level sales.This is a logic problem, not just a performance problem. Always understand the grain before joining and aggregating.
๐น 13. "UNION" vs "UNION ALL"
"UNION" removes duplicates.
SELECT Customer_ID FROM Current_Customers
UNION
SELECT Customer_ID FROM Previous_Customers;
"UNION ALL" simply combines the results:
SELECT Customer_ID FROM Current_Customers
UNION ALL
SELECT Customer_ID FROM Previous_Customers;
If you don't need duplicate removal,
UNION ALL is generally preferable because it avoids the additional deduplication work.๐น 14. Avoid Repeating Expensive Logic
Suppose the same complex calculation appears multiple times.
Instead of repeating it, consider using: CTEs, Derived tables, Temporary tables, Views, Pre-aggregated tables.
The objective is: Calculate expensive logic only when necessary.
๐น 15. CTEs and Performance
CTEs make SQL much easier to organize:
WITH Customer_Sales AS (
SELECT Customer_ID, SUM(Sales) AS Total_Sales
FROM Orders
GROUP BY Customer_ID
)
SELECT * FROM Customer_Sales WHERE Total_Sales > 10000;
A CTE is primarily a query organization technique. Whether it improves performance depends on the database engine, query structure, materialization behavior, and optimizer.
๐น 16. Reduce Data Before Expensive Operations
A useful analytical pattern is:
Raw Data โ Filter โ Select Required Columns โ Join โ Aggregate โ Window Function โ Final Result
The exact optimal order depends on the query, but the principle is: Don't process more data than necessary.
๐น 17. Avoid Correlated Subqueries When a Better Approach Exists
A correlated subquery may conceptually execute in relation to each outer row:
SELECT e.Employee, e.Salary
FROM Employees e
WHERE e.Salary > (
SELECT AVG(e2.Salary)
FROM Employees e2
WHERE e2.Department = e.Department
);
Sometimes a CTE + join or window function can express the same business logic more efficiently:
WITH Employee_Data AS (
SELECT
Employee,
Department,
Salary,
AVG(Salary) OVER (PARTITION BY Department) AS Avg_Dept_Salary
FROM Employees
)
SELECT Employee, Department, Salary
FROM Employee_Data
WHERE Salary > Avg_Dept_Salary;
โค5
๐น 18. Query Readability Also Matters
A query can be technically fast but difficult to understand.
Bad analytical SQL often contains:
โ Unclear aliases, repeated logic, huge nested queries, unnecessary columns, unnecessary joins, no explanation of business logic
Good SQL should be:
โ Correct, efficient, readable, maintainable, easy to troubleshoot
๐น 19. SQL Optimization Checklist
Before finalizing a query, ask:
1. Do I need all these columns?
2. Am I processing unnecessary rows?
3. Are my joins using the correct keys?
4. Did the join change the grain?
5. Am I accidentally multiplying values?
6. Can a date filter be written as a range?
7. Do I really need "DISTINCT"?
8. Could "UNION ALL" be used instead of "UNION"?
9. Can I inspect the execution plan?
10. Will this query still perform well on a much larger dataset?
๐ฏ SQL Interview Challenge
Question:
A query takes 30 seconds:
How could you improve it?
A better approach is:
Why?
โ Avoids unnecessary columns
โ Uses a range filter
โ Can be more index-friendly
โ Clearly defines the required period
Then use
๐ง Double Tap โค๏ธ For More
A query can be technically fast but difficult to understand.
Bad analytical SQL often contains:
โ Unclear aliases, repeated logic, huge nested queries, unnecessary columns, unnecessary joins, no explanation of business logic
Good SQL should be:
โ Correct, efficient, readable, maintainable, easy to troubleshoot
๐น 19. SQL Optimization Checklist
Before finalizing a query, ask:
1. Do I need all these columns?
2. Am I processing unnecessary rows?
3. Are my joins using the correct keys?
4. Did the join change the grain?
5. Am I accidentally multiplying values?
6. Can a date filter be written as a range?
7. Do I really need "DISTINCT"?
8. Could "UNION ALL" be used instead of "UNION"?
9. Can I inspect the execution plan?
10. Will this query still perform well on a much larger dataset?
๐ฏ SQL Interview Challenge
Question:
A query takes 30 seconds:
SELECT * FROM Orders WHERE YEAR(Order_Date) = 2026;
How could you improve it?
A better approach is:
SELECT Order_ID, Customer_ID, Order_Date, Sales
FROM Orders
WHERE Order_Date >= '2026-01-01'
AND Order_Date < '2027-01-01';
Why?
โ Avoids unnecessary columns
โ Uses a range filter
โ Can be more index-friendly
โ Clearly defines the required period
Then use
EXPLAIN/EXPLAIN ANALYZE to verify the actual execution plan.๐ง Double Tap โค๏ธ For More
โค5๐2
๐ ๐ง๐ผ๐ฝ ๐ง๐ฒ๐ฐ๐ต ๐๐ฒ๐ฟ๐๐ถ๐ณ๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป๐ ๐๐ผ ๐๐ฎ๐ป๐ฑ ๐๐ถ๐ด๐ต-๐ฃ๐ฎ๐๐ถ๐ป๐ด ๐๐ผ๐ฏ๐ ๐ถ๐ป ๐ฎ๐ฌ๐ฎ๐ฒ๐
๐ฐ Highest Salary: โน41 LPA
๐ Average Salary: โน7.4 LPA
๐ 2,000+ Students Placed
๐ข 500+ Hiring Partners
๐ป Full Stack :- https://pdlink.in/3SuUeuD
๐ Data Analytics :- https://pdlink.in/45vk5ph
๐ซAI Engineering :- https://pdlink.in/4fWJVID
๐ฅ Take the first step towards your high-paying tech career in 2026!
๐ฐ Highest Salary: โน41 LPA
๐ Average Salary: โน7.4 LPA
๐ 2,000+ Students Placed
๐ข 500+ Hiring Partners
๐ป Full Stack :- https://pdlink.in/3SuUeuD
๐ Data Analytics :- https://pdlink.in/45vk5ph
๐ซAI Engineering :- https://pdlink.in/4fWJVID
๐ฅ Take the first step towards your high-paying tech career in 2026!
โค1
๐๐ฎ๐๐ฎ ๐ฆ๐ฐ๐ถ๐ฒ๐ป๐ฐ๐ฒ ๐๐ฅ๐๐ ๐ข๐ป๐น๐ถ๐ป๐ฒ ๐ ๐ฎ๐๐๐ฒ๐ฟ๐ฐ๐น๐ฎ๐๐ ๐
๐ซAccelerate your career in Data Science
๐ซDiscover the skills, tools and career roadmap needed to enter this high-demand field.
๐ฅ Beginner-friendly online sessionโno prior experience required!
๐ฅ๐ฒ๐ด๐ถ๐๐๐ฒ๐ฟ ๐๐ผ๐ฟ ๐๐ฅ๐๐ ๐:-
https://pdlink.in/46adC3l
(Only few slots left )
๐ Date: September 11, 2026
โฐ Time: 7:00 PM
๐ซAccelerate your career in Data Science
๐ซDiscover the skills, tools and career roadmap needed to enter this high-demand field.
๐ฅ Beginner-friendly online sessionโno prior experience required!
๐ฅ๐ฒ๐ด๐ถ๐๐๐ฒ๐ฟ ๐๐ผ๐ฟ ๐๐ฅ๐๐ ๐:-
https://pdlink.in/46adC3l
(Only few slots left )
๐ Date: September 11, 2026
โฐ Time: 7:00 PM
๐ Data Analyst Roadmap โ Part 20
๐ง SQL Level 10 โ Cohort Analysis, Retention & Customer Analytics
Now we're moving from writing SQL queries to using SQL for real analytical problems.
Customer analytics is one of the most important areas because businesses want to know:
๐ฅ Who are our customers?
๐ When did they first purchase?
๐ Do they come back?
๐ When do they stop returning?
๐ฐ Which customers generate most revenue?
๐ How does behavior change over time?
One of the most powerful techniques for this is Cohort Analysis.
๐น 1. What Is Cohort Analysis?
A cohort is a group who share a common starting point.
โข Jan 2026 Cohort = first purchase in Jan 2026
โข Feb 2026 Cohort = first purchase in Feb 2026
Instead of mixing everyone, we track each group over time.
๐น 2. Why It Matters
Suppose total monthly customers are increasing.
That sounds positive.
But what if new customers are increasing while existing customers stop returning?
A simple monthly report may hide this problem.
Cohort analysis separates New vs Returning customers.
This makes retention problems much easier to identify.
๐น 3. Step 1 โ Find Each Customer's First Purchase
This gives us the first purchase date for every customer.
๐น 4. Step 2 โ Assign a Cohort Month
We can convert the first purchase into a month-level cohort.
The exact month-truncation syntax varies between SQL databases.
๐น 5. Step 3 โ Join Cohort Back to Orders
Now we need both:
Customer's cohort
and
Customer's subsequent activity
Now every transaction knows which cohort the customer belongs to.
๐น 6. Cohort Month vs Activity Month
โข Cohort Month: When first purchased
โข Activity Month: When purchase happened
๐น 7. Measuring Retention
Retention measures how many customers from a cohort remain active in later periods.
Retention = Active in Period / Original Cohort * 100
โข Jan cohort: 100 customers
โข Feb: 60 active โ 60%
โข Mar: 40 active โ 40%
๐น 8. Retention Month
Months Since Cohort = Activity - Cohort
Eg:
๐น 9. Cohort Retention Matrix
Conceptually, the final result may look like:
This is often called a cohort retention matrix.
It immediately shows whether newer customer cohorts are retaining better or worse.
๐น 10. Customer Lifetime Value (CLV)
Another important customer metric is Customer Lifetime Value (CLV/LTV).
A simplified version can be based on:
Total Revenue Generated by Customer
A more advanced business model may consider:
โข Revenue
โข Gross margin
โข Purchase frequency
โข Retention
โข Customer lifespan
โข Acquisition cost
๐น 11. Average Order Value (AOV)
A basic customer metric is:
Average Order Value = Total Sales รท Number of Orders
In SQL:
๐ง SQL Level 10 โ Cohort Analysis, Retention & Customer Analytics
Now we're moving from writing SQL queries to using SQL for real analytical problems.
Customer analytics is one of the most important areas because businesses want to know:
๐ฅ Who are our customers?
๐ When did they first purchase?
๐ Do they come back?
๐ When do they stop returning?
๐ฐ Which customers generate most revenue?
๐ How does behavior change over time?
One of the most powerful techniques for this is Cohort Analysis.
๐น 1. What Is Cohort Analysis?
A cohort is a group who share a common starting point.
โข Jan 2026 Cohort = first purchase in Jan 2026
โข Feb 2026 Cohort = first purchase in Feb 2026
Instead of mixing everyone, we track each group over time.
๐น 2. Why It Matters
Suppose total monthly customers are increasing.
That sounds positive.
But what if new customers are increasing while existing customers stop returning?
A simple monthly report may hide this problem.
Cohort analysis separates New vs Returning customers.
This makes retention problems much easier to identify.
๐น 3. Step 1 โ Find Each Customer's First Purchase
SELECT
Customer_ID,
MIN(Order_Date) AS First_Order_Date
FROM Orders
GROUP BY Customer_ID;
This gives us the first purchase date for every customer.
Customer | First Order
C101 | 2026-01-10
C102 | 2026-01-18
C103 | 2026-02-05
๐น 4. Step 2 โ Assign a Cohort Month
We can convert the first purchase into a month-level cohort.
First Purchase Date โ Cohort Month
C101 โ 2026-01
C103 โ 2026-02
The exact month-truncation syntax varies between SQL databases.
๐น 5. Step 3 โ Join Cohort Back to Orders
Now we need both:
Customer's cohort
and
Customer's subsequent activity
WITH Customer_Cohorts AS (
SELECT Customer_ID, MIN(Order_Date) AS First_Order_Date
FROM Orders GROUP BY Customer_ID
)
SELECT o.Customer_ID, c.First_Order_Date, o.Order_Date, o.Sales
FROM Orders o
JOIN Customer_Cohorts c ON o.Customer_ID = c.Customer_ID;
Now every transaction knows which cohort the customer belongs to.
๐น 6. Cohort Month vs Activity Month
โข Cohort Month: When first purchased
โข Activity Month: When purchase happened
Customer | Cohort | Activity
C101 | Jan | Jan
C101 | Jan | Feb
C101 | Jan | Mar
๐น 7. Measuring Retention
Retention measures how many customers from a cohort remain active in later periods.
Retention = Active in Period / Original Cohort * 100
โข Jan cohort: 100 customers
โข Feb: 60 active โ 60%
โข Mar: 40 active โ 40%
๐น 8. Retention Month
Months Since Cohort = Activity - Cohort
Eg:
Customer | Cohort | Activity | Months_Since_Cohort
C101 | Jan | Jan | 0
C101 | Jan | Feb | 1
C101 | Jan | Mar | 2
๐น 9. Cohort Retention Matrix
Conceptually, the final result may look like:
Cohort | Month0 | Month1 | Month2 | Month3
Jan | 100% | 60% | 40% | 30%
Feb | 100% | 65% | 45% | โ
Mar | 100% | 70% | โ | โ
This is often called a cohort retention matrix.
It immediately shows whether newer customer cohorts are retaining better or worse.
๐น 10. Customer Lifetime Value (CLV)
Another important customer metric is Customer Lifetime Value (CLV/LTV).
A simplified version can be based on:
Total Revenue Generated by Customer
A more advanced business model may consider:
โข Revenue
โข Gross margin
โข Purchase frequency
โข Retention
โข Customer lifespan
โข Acquisition cost
๐น 11. Average Order Value (AOV)
A basic customer metric is:
Average Order Value = Total Sales รท Number of Orders
In SQL:
โค2
SELECT Customer_ID, SUM(Sales) / COUNT(DISTINCT Order_ID) AS AOV
FROM Orders GROUP BY Customer_ID;
This tells us how much a customer spends per order on average.
๐น 12. Purchase Frequency
We can also calculate the number of orders per customer:
SELECT Customer_ID, COUNT(DISTINCT Order_ID) AS Number_of_Orders
FROM Orders GROUP BY Customer_ID;
Customers can then be segmented based on activity.
For example:
โข 1 order โ One-time customer
โข 2โ5 orders โ Repeat customer
โข 6+ orders โ Highly active customer
โ ๏ธ These thresholds are business rules, not universal definitions.
๐น 13. Recency
SELECT Customer_ID, MAX(Order_Date) AS Last_Order_Date
FROM Orders GROUP BY Customer_ID;
Then compare the last order date with a chosen analysis date.
A customer who purchased recently is generally more active than someone whose last purchase was a long time ago.
๐น 14. RFM Analysis
โข R โ Recency: How recently?
โข F โ Frequency: How often?
โข M โ Monetary: How much?
Example:
Customer | Recency | Frequency | Monetary
C101 | 5 days | 12 orders | โน85,000
C102 | 20 days | 6 orders | โน42,000
C103 | 120 days| 2 orders | โน8,000
This allows businesses to identify:
โญ High-value customers
๐ Loyal customers
โ ๏ธ Customers at risk
๐ค Inactive customers
๐น 15. Segmentation With CASE
You can convert analytical metrics into business segments.
For example:
SELECT Customer_ID, Total_Sales,
CASE
WHEN Total_Sales >= 50000 THEN 'High Value'
WHEN Total_Sales >= 20000 THEN 'Medium Value'
ELSE 'Low Value'
END AS Customer_Segment
FROM Customer_Sales;
This transforms numerical analysis into a business-friendly classification.
๐น 16. Repeat Customers
SELECT Customer_ID, COUNT(DISTINCT Order_ID) AS Order_Count
FROM Orders GROUP BY Customer_ID
HAVING COUNT(DISTINCT Order_ID) > 1;
This finds customers with more than one order.
๐น 17. First vs Repeat Purchase
You can use ROW_NUMBER() to identify purchase sequence.
WITH Customer_Orders AS (
SELECT Customer_ID, Order_ID, Order_Date,
ROW_NUMBER() OVER (PARTITION BY Customer_ID ORDER BY Order_Date) AS Purchase_Number
FROM Orders
)
SELECT * FROM Customer_Orders;
Now:
Purchase_Number = 1 means the customer's first purchase.Purchase_Number = 2 means the second purchase.And so on.
This opens the door to deeper customer behavior analysis.
๐น 18. Time Between Purchases
SELECT Customer_ID, Order_Date,
LAG(Order_Date) OVER (PARTITION BY Customer_ID ORDER BY Order_Date) AS Previous_Order_Date
FROM Orders;
Now you can calculate the number of days between purchases.
โ Helps answer "How frequently do customers return?"
๐น 19. Churn Analysis
Churn means customers stop using or purchasing from a business.
SQL can help identify customers whose activity has fallen below a defined threshold.
For example:
Last Purchase โ Days Since โ Business Threshold โ Active / At Risk / Inactive
SQL finds pattern, business defines churn.
๐ฏ Interview Challenge
Find customers with โฅ3 orders and >50,000 spent:
SELECT Customer_ID, COUNT(DISTINCT Order_ID) AS Order_Count, SUM(Sales) AS Total_Sales
FROM Orders
GROUP BY Customer_ID
HAVING COUNT(DISTINCT Order_ID) >= 3 AND SUM(Sales) > 50000;
๐ง Double Tap โค๏ธ For More
โค6
๐ง๐ผ๐ฝ ๐ฑ ๐๐ฅ๐๐ ๐๐ผ๐๐ฟ๐๐ฒ๐ ๐๐ผ ๐๐ถ๐ฐ๐ธ๐๐๐ฎ๐ฟ๐ ๐ฌ๐ผ๐๐ฟ ๐๐ฎ๐๐ฎ ๐ฆ๐ฐ๐ถ๐ฒ๐ป๐ฐ๐ฒ ๐๐ฎ๐ฟ๐ฒ๐ฒ๐ฟ ๐
Want to start a career in Data Science without spending money?
Here are 5 beginner-friendly learning resources covering essential skills such as Python, SQL, Machine Learning and hands-on projects.
๐ ๐๐ป๐ฟ๐ผ๐น๐น ๐ณ๐ผ๐ฟ ๐๐ฅ๐๐ ๐:-
https://pdlink.in/4ilAmok
๐ฏ Perfect for Students โข Freshers โข Beginners โข Aspiring Data Scientists
๐ก Learn โ Practice โ Build Projects โ Create Your Portfolio
Want to start a career in Data Science without spending money?
Here are 5 beginner-friendly learning resources covering essential skills such as Python, SQL, Machine Learning and hands-on projects.
๐ ๐๐ป๐ฟ๐ผ๐น๐น ๐ณ๐ผ๐ฟ ๐๐ฅ๐๐ ๐:-
https://pdlink.in/4ilAmok
๐ฏ Perfect for Students โข Freshers โข Beginners โข Aspiring Data Scientists
๐ก Learn โ Practice โ Build Projects โ Create Your Portfolio