Free tutorials & notes in Hindi & English · Clean code examples · Mobile friendly learning
MySQL + SQL · Lesson 80

MySQL में Window Functions

Window Functions Detail Rows रखती हैं

Window function current row से related rows पर calculate करती है लेकिन उन्हें collapse नहीं करती। GROUP BY one summary row per group देता; window aggregate same group summary हर detail row से attach कर सकता है।

aggregate_or_window_function(...)
OVER (
  PARTITION BY ...
  ORDER BY ...
  frame_clause
)
Three layers: PARTITION BY group चुनता, window ORDER BY calculation order, frame current row के आसपास participating rows।

Verified Score Lab

IDStudentClassMarks
1AaravX-A86
2MeeraX-A92
3SanaX-A92
4KabirX-B74
5VihaanX-B88
6RiyaX-B81

X-A total/average 270/90; X-B total/average 243/81।

Rows Collapse किए बिना Class Totals और Averages

SELECT student_id, student_name, class_name, marks,
       SUM(marks) OVER (
         PARTITION BY class_name
       ) AS class_total,
       ROUND(AVG(marks) OVER (
         PARTITION BY class_name
       ), 2) AS class_average
FROM advanced_scores
ORDER BY class_name, student_id;
1 | Aarav | X-A | 86 | 270 | 90.00 2 | Meera | X-A | 92 | 270 | 90.00 3 | Sana | X-A | 92 | 270 | 90.00 4 | Kabir | X-B | 74 | 243 | 81.00 5 | Vihaan | X-B | 88 | 243 | 81.00 6 | Riya | X-B | 81 | 243 | 81.00

सभी six detail rows रहती हैं। PARTITION BY omit हो तो SUM/AVG one global six-row partition use करेंगे।

Explicit Frame के साथ Running Total

SELECT student_name, class_name, marks,
       SUM(marks) OVER (
         PARTITION BY class_name
         ORDER BY student_id
         ROWS BETWEEN UNBOUNDED PRECEDING
                  AND CURRENT ROW
       ) AS running_total
FROM advanced_scores
ORDER BY class_name, student_id;
Aarav | X-A | 86 | 86 Meera | X-A | 92 | 178 Sana | X-A | 92 | 270 Kabir | X-B | 74 | 74 Vihaan | X-B | 88 | 162 Riya | X-B | 81 | 243

Frame partition की first row से current row तक है। Explicit ROWS physical row-by-row accumulation देता। Default frames equal ORDER BY peers को साथ treat कर सकती हैं, इसलिए financial/marks reports में frame implicit न छोड़ें।

LAG से Previous Row Compare करें

SELECT student_name, class_name, marks,
       LAG(marks) OVER (
         PARTITION BY class_name
         ORDER BY student_id
       ) AS previous_marks,
       marks - LAG(marks) OVER (
         PARTITION BY class_name
         ORDER BY student_id
       ) AS change_from_previous
FROM advanced_scores
ORDER BY class_name, student_id;
Aarav | X-A | 86 | NULL | NULL Meera | X-A | 92 | 86 | 6 Sana | X-A | 92 | 92 | 0 Kabir | X-B | 74 | NULL | NULL Vihaan | X-B | 88 | 74 | 14 Riya | X-B | 81 | 88 | -7

LAG self join के बिना earlier row पढ़ता है। LEAD later row पढ़ता है। हर partition की first row का predecessor नहीं, इसलिए LAG NULL देता है जब तक supported default argument न हो।

Named Window Reuse करें

SELECT student_name, class_name, marks,
       SUM(marks) OVER w AS class_total,
       ROUND(AVG(marks) OVER w, 2) AS class_average
FROM advanced_scores
WINDOW w AS (PARTITION BY class_name)
ORDER BY class_name, student_id;

WINDOW clause same specification repeat होने से बचाती है। Meaningful names लें और share करने से पहले confirm करें functions को identical ordering/frame semantics चाहिए।

Outer Query में Window Result Filter करें

Window functions same query level पर WHERE के बाद evaluate होती हैं, इसलिए two-stage form चाहिए:

WITH scored AS (
  SELECT student_id, student_name,
         class_name, marks,
         AVG(marks) OVER (
           PARTITION BY class_name
         ) AS class_average
  FROM advanced_scores
)
SELECT student_name, class_name, marks
FROM scored
WHERE marks > class_average
ORDER BY class_name, student_id;
Meera | X-A | 92 Sana | X-A | 92 Vihaan | X-B | 88

गलतियाँ, Performance और अभ्यास

  • Window ORDER BY final display order guarantee नहीं करता।
  • Row-sensitive calculations में deterministic ordering key लें।
  • Running/moving logic में frames explicitly लिखें।
  • Window PARTITION BY को physical table partitioning न समझें।
  • Different window sorts extra work माँग सकती हैं; EXPLAIN देखें।

अभ्यास: global और class averages साथ; two-row moving average; LEAD से next marks; CTE से above-average filter; tied ORDER BY values का default frame effect समझाएँ।

Official संदर्भ

Syntax और behavior official MySQL 8.4 manual से जाँचे गए हैं। Production से पहले अपने server पर plans और limits verify करें।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

Window function और GROUP BY में क्या अंतर है?
GROUP BY सामान्यतः rows को one row per group में collapse करता है। Window function related rows पर calculate करके हर detail row रखता है।
PARTITION BY क्या करता है?
यह query rows को independent windows में बाँटता है। Omit करने पर all rows one partition बनती हैं।
क्या window ORDER BY और final ORDER BY same हैं?
नहीं। Window ORDER BY partition के calculation order को; top-level ORDER BY displayed result को control करता है।
Running total में ROWS explicitly क्यों लिखें?
Explicit ROWS frame row-by-row intent clear करता और tied ORDER BY values पर peer-sensitive default-frame surprises रोकता है।
क्या window function direct WHERE में use हो सकती है?
Same query level पर नहीं। CTE या derived table में calculate करके outer query में filter करें।
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.