Chapter 8: Window Functions & CTEs in SQL for Data Science

Introduction: Group By से आगे की दुनिया – Chapter 7 तक हमने JOIN + SUBQUERY सीखा। पर एक problem थी।

Problem: “हर Player का Kills भी चाहिए और साथ में उसका Rank भी चाहिए”
अगर GROUP BY करोगे तो player की detail गायब हो जाएगी। सिर्फ 1 row per player बचेगी।

यही problem solve करते हैं WINDOW FUNCTIONS।Window Function = Row मिटती नहीं है। साथ में Calculation भी आ जाता है।और CTE = Common Table Expression = Query को readable बनाने का तरीका। Query के अंदर Query लिखने से बचाता है।

Netflix, Amazon, Swiggy के Data Analyst रोज RANK(), LAG(), LEAD() use करते हैं। चलो सीखते हैं।

Part 1: Window Functions क्या हैं? –

Syntax का फर्क देखो:

SELECT team, AVG(kills) FROM players GROUP BY team;

Output: 10 team = 10 rows. Player की detail गई।

Window Function:

SELECT name, team, kills, AVG(kills) OVER(PARTITION BY team) as team_avg
FROM players;

Output: सारे player दिखेंगे + साथ में उनकी team का average भी।

3 Keywords याद रखो:

1.OVER() – ये बताता है ये Window Function है

2.PARTITION BY – Group किससे करना है। Group By जैसा

3.ORDER BY – Window के अंदर Sort

Part 2: सबसे जरूरी 6 Window Functions

मान लो table: sales

datesalesmanamount
2025-01-01Amit100
2025-01-02Amit200
2025-01-01Rahul150

1.RANK() और DENSE_RANK() – Ranking निकालना”

Top 3 Salesman कौन हैं?”

SELECT salesman, amount,
RANK() OVER(ORDER BY amount DESC) as rnk
FROM sales;

Output:

1.Rahul 200 → Rank 1

2.Amit 200 → Rank 1

3.Amit 100 → Rank 3देखो 2 लोग Rank 1 पर थे तो अगला Rank 3 हो गया। Gap आ गया।

DENSE_RANK(): Gap नहीं आएगा। 1,1,2,3

Data Science Use: Leaderboard, Top N per Category

2.ROW_NUMBER() – Unique Number देना

SELECT *, ROW_NUMBER() OVER(PARTITION BY salesman ORDER BY amount DESC) as rn
FROM sales;

हर salesman के अंदर सबसे ज्यादा sale को 1, दूसरा 2।
Use: Duplicate हटाना, Top 1 per Group निकालना

3.LAG() – पिछला Row लाना

“पिछले दिन के मुकाबले Sale कितनी बढ़ी?”

SELECT date, salesman, amount,
LAG(amount) OVER(PARTITION BY salesman ORDER BY date) as prev_day_sale
FROM sales;

Output: Amit 200 के सामने 100 आएगा।
Formula: amount – LAG(amount) = Day over Day Growth

4.LEAD() – अगला Row लाना

LEAD(amount) OVER(PARTITION BY salesman ORDER BY date)

Output: 100, 300, 450…
Finance, Stock Market में सबसे ज्यादा use।

6.AVG() OVER() – Moving Average

“पिछले 3 दिन का Average”

AVG(amount) OVER(ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)

Part 3: CTE – Common Table Expressions –

Subquery लिखने से Query गंदी हो जाती है। CTE उसे साफ करता है।

बिना CTE:

SELECT * FROM (SELECT team, AVG(kills) avg FROM players GROUP BY team) t WHERE avg > 50;

CTE के साथ – पढ़ने में आसान:

WITH team_avg AS (
SELECT team, AVG(kills) as avg_kills
FROM players
GROUP BY team
)
SELECT * FROM team_avg WHERE avg_kills > 50;

Syntax: WITH cte_name AS ( query ) SELECT …

CTE के 3 फायदे:

1.Readable: Step by Step Logic

2.Reuse: 1 CTE को 2 बार use कर सकते हो

3.Recursive: Tree, Hierarchy निकालने के लिएExample: Multiple CTE

Example: Multiple CTE

WITH team_stats AS (
SELECT team, AVG(kills) avg FROM players GROUP BY team
),
top_teams AS (
SELECT team FROM team_stats WHERE avg > 50
)
SELECT p.name FROM players p JOIN top_teams t ON p.team = t.team;

Part 4: Real Data Science Examples –

Example 1: E-commerce – Top 3 Products per Category

WITH ranked_products AS (
SELECT category, product, sales,
RANK() OVER(PARTITION BY category ORDER BY sales DESC) as rnk
FROM products
)
SELECT * FROM ranked_products WHERE rnk <= 3;

Logic: पहले rank दो, फिर filter करो। Group By से नहीं होगा।

Example 2: Finance – Stock Growth

SELECT date, price,
((price – LAG(price) OVER(ORDER BY date)) / LAG(price) OVER(ORDER BY date)) * 100 as pct_change
FROM stocks;

Example 3: HR – Employee Salary Percentile

SELECT name, salary,
PERCENT_RANK() OVER(ORDER BY salary) * 100 as percentile
FROM employees;

Example 4: Gaming – Streak निकालना

SELECT player, date, result,
LAG(result) OVER(PARTITION BY player ORDER BY date) as prev_result
FROM matches;

अगर prev = Win और current = Win तो 2 की streak।

Part 5: Window vs Group By vs Subquery –

GROUP BYWINDOW FUNCTION
Rowsकम हो जाती हैंवही रहती हैं
Detailगायबबनी रहती है
Use CaseReportAnalysis

Golden Rule: Report चाहिए = Group By। Analysis चाहिए = Window Function।

Part 6: 15 Interview Questions –

1. दूसरा सबसे ज्यादा Salary वाला

2.हर Department में Top 2 Employee

3.Running Total of Sales

4.पिछले महीने के मुकाबले % Growth

5.Consecutive Login Days निकालो

6.Nth Highest Salary

7.Duplicate Row हटाओ ROW_NUMBER()

8.First और Last Order Date

9.7 Day Moving Average

10.Customer का पहला और आखिरी Product

11.Gap and Island Problem

12.Salary में 20% से ज्यादा jump

13.Sessionization Problem

14.Cohort Analysis

15.RANK() और DENSE_RANK() का फर्क

Conclusion + Key Takeaways

क्या सीखा?

1.Window Function = Row नहीं मिटती + Calculation भी मिलता है। OVER(PARTITION BY … ORDER BY …)

2.RANK, LAG, LEAD, SUM OVER – यही 4 सबसे जरूरी हैं

3.CTE = Query को साफ और Step-wise लिखो। WITH … AS

Pro Tip: Data Science में 80% query इस pattern की होती है:

WITH cte AS (…)
SELECT *, RANK() OVER(…) FROM cte

Practice: LeetCode SQL Window Function 50 और StrataScratch करो।

अगला Chapter: Chapter 9 – “SQL for Data Analysis: Case Studies”
Real कंपनी के 5 Case Study
तोड़ेंगे।

Leave a Comment

Your email address will not be published. Required fields are marked *