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

ROW_NUMBER, RANK और DENSE_RANK

ROW_NUMBER, RANK और DENSE_RANK

FunctionTiesNext value
ROW_NUMBER()Always unique numbersAlways +1
RANK()Peers same rankTie के बाद gap
DENSE_RANK()Peers same rankNo gap
Requirement से चुनें: fixed row count में ROW_NUMBER; competition positions में RANK; distinct score bands में DENSE_RANK।

Verified Tie Dataset

advanced_scores table deliberately Meera और Sana दोनों को X-A में 92 marks देती है। यही tie three functions का real difference दिखाती है।

ClassDescending marks
X-A92 Meera, 92 Sana, 86 Aarav
X-B88 Vihaan, 81 Riya, 74 Kabir

Side-by-Side Ranking Query

SELECT student_name, class_name, marks,
       ROW_NUMBER() OVER (
         PARTITION BY class_name
         ORDER BY marks DESC, student_id
       ) AS row_no,
       RANK() OVER (
         PARTITION BY class_name
         ORDER BY marks DESC
       ) AS rank_no,
       DENSE_RANK() OVER (
         PARTITION BY class_name
         ORDER BY marks DESC
       ) AS dense_rank_no
FROM advanced_scores
ORDER BY class_name, row_no;

ROW_NUMBER deterministic tie-breaker के लिए student_id जोड़ता है। RANK/DENSE_RANK केवल marks से order करते हैं ताकि equal marks peers रहें।

Verified Ranking Output

Meera | X-A | 92 | row 1 | rank 1 | dense 1 Sana | X-A | 92 | row 2 | rank 1 | dense 1 Aarav | X-A | 86 | row 3 | rank 3 | dense 2 Vihaan | X-B | 88 | row 1 | rank 1 | dense 1 Riya | X-B | 81 | row 2 | rank 2 | dense 2 Kabir | X-B | 74 | row 3 | rank 3 | dense 3

X-A के two tied leaders के बाद RANK position 2 skip करता; DENSE_RANK Aarav को 2 देता। ROW_NUMBER distinct row positions 1, 2, 3 देता है।

Deterministic Ordering और Tie Policy

Ranking report स्पष्ट करे equal marks same position share करेंगे या fixed-row selection ties कैसे break करेगी।

  • All tied winners: RANK या DENSE_RANK <= N filter करें।
  • Exactly N rows: documented tie-breaker के साथ ROW_NUMBER <= N।
  • RANK में unique key न जोड़ें जब तक peer ties intentionally destroy न करनी हों।
  • Final display order के लिए top-level ORDER BY फिर भी चाहिए।

हर Class के Top Two Rows

WITH ranked AS (
  SELECT student_id, student_name,
         class_name, marks,
         ROW_NUMBER() OVER (
           PARTITION BY class_name
           ORDER BY marks DESC, student_id
         ) AS row_no
  FROM advanced_scores
)
SELECT student_name, class_name, marks, row_no
FROM ranked
WHERE row_no <= 2
ORDER BY class_name, row_no;
Meera | X-A | 92 | 1 Sana | X-A | 92 | 2 Vihaan | X-B | 88 | 1 Riya | X-B | 81 | 2

Window value same query level WHERE में filter नहीं होती, इसलिए CTE पहले calculate करती है। Nth position के all ties include करने हों तो ROW_NUMBER को RANK से replace करें, भले N से अधिक rows आएँ।

Deduplication और Pagination Patterns

हर student का latest record रखें

WITH latest AS (
  SELECT log_id, student_id, event_time,
         ROW_NUMBER() OVER (
           PARTITION BY student_id
           ORDER BY event_time DESC, log_id DESC
         ) AS row_no
  FROM attendance_log
)
SELECT log_id, student_id, event_time
FROM latest
WHERE row_no = 1;

Unique log_id tie-breaker “latest” deterministic बनाता है। Older duplicates delete करने से पहले review करें। Pagination में ROW_NUMBER stable ordered snapshot label कर सकता है, पर live data changes pages shift कर सकते हैं; frequently changing apps में keyset pagination safer हो सकती है।

Performance, Mistakes और अभ्यास

  • Partition/order sorting माँग सकते हैं; EXPLAIN देखें।
  • Ranking stage में केवल required columns project करें।
  • Indexing filtering/access मदद कर सकती, हर window sort eliminate नहीं।
  • Reproducibility में deterministic ordering के बिना ROW_NUMBER न लें।
  • First, Nth और last positions पर ties test करें।

अभ्यास: RANK से all class winners; DENSE_RANK से top two score bands; ROW_NUMBER से exactly two students; X-B second place tie जोड़कर result counts compare करें।

Official संदर्भ

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

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

ROW_NUMBER ties को कैसे handle करता है?
हर row को unique sequence देता है। Complete deterministic ORDER BY न हो तो tied rows का order guaranteed नहीं।
RANK ties को कैसे handle करता है?
Peers same rank लेते और next rank में gap आता है। Two rows rank 1 पर हों तो next rank 3।
DENSE_RANK ties को कैसे handle करता है?
Peers same rank लेते, लेकिन next distinct value consecutive next rank लेती है; gap नहीं।
हर group के top N rows कैसे लौटाएँ?
CTE/derived table में group से PARTITION करके ROW_NUMBER या appropriate rank calculate करें, फिर outer query में filter करें।
क्या RANK ordering में unique key जोड़नी चाहिए?
केवल जब ties break करने हों। RANK ORDER BY में student_id जोड़ना equal marks को non-peer बनाकर tie semantics बदल देता है।
🔗

Share this topic with a friend

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

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

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

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

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