Nth Highest Salary निकालें
एक classic interview सवाल
"Nth सबसे ऊँची salary ढूँढो" सबसे ज़्यादा पूछे SQL interview सवालों में से एक है। यह sorting, LIMIT, OFFSET और duplicates की आपकी समझ जाँचता है। इसे हल करने के कुछ साफ़ तरीके हैं — LIMIT/OFFSET, और आधुनिक MySQL पर DENSE_RANK।
दूसरा सबसे ऊँचा
SELECT DISTINCT salary FROM employees ORDER BY salary DESC LIMIT 1 OFFSET 1;
Salaries ऊँची से नीची sort कीजिए, फिर OFFSET 1 top वाली skip करता है, और LIMIT 1 अगली लौटाता है — दूसरी सबसे ऊँची।
OFFSET से Nth सबसे ऊँचा
-- Nth सबसे ऊँची: OFFSET is N-1 SELECT DISTINCT salary FROM employees ORDER BY salary DESC LIMIT 1 OFFSET 2; -- 3rd सबसे ऊँची
Nth सबसे ऊँची को, OFFSET N-1 इस्तेमाल कीजिए। 3rd सबसे ऊँची पाने को, offset 2। यह सामान्य pattern कोई भी rank ढूँढता है जो आप चाहें।
Duplicate salaries संभालना
DISTINCT महत्वपूर्ण है। अगर तीन employees सब top salary कमाएँ, वे तीन rows भरेंगे, और offset उसी salary के भीतर skip करेगा। DISTINCT बराबर salaries को एक में collapse करता है, तो "दूसरी सबसे ऊँची" का मतलब दूसरी distinct salary है, जो लोग आमतौर पर चाहते हैं।
DENSE_RANK तरीका
SELECT salary FROM (
SELECT salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employees
) t
WHERE rnk = 2; -- 2nd सबसे ऊँची
MySQL 8.0+ में, DENSE_RANK() हर salary को rank देता है, बराबर salaries को rank साझा करके बिना gaps। rnk = N filter करना बहुत साफ़ पढ़ता है और ties स्वाभाविक रूप से संभालता है।
Subquery तरीका
SELECT MAX(salary) FROM employees WHERE salary < (SELECT MAX(salary) FROM employees);
ख़ासकर दूसरी सबसे ऊँची को, यह classic subquery maximum के नीचे सबसे ऊँची salary ढूँढती है। यह N=2 को साफ़ है, हालाँकि LIMIT/OFFSET या DENSE_RANK किसी भी N को बेहतर scale होते हैं।
आम गलतियाँ
- DISTINCT भूलना। Duplicate salaries फिर offset तोड़ती हैं।
- OFFSET में off-by-one। Nth सबसे ऊँची
OFFSET N-1इस्तेमाल करती है। - पुराने MySQL पर DENSE_RANK इस्तेमाल करना। Window functions को MySQL 8.0+ चाहिए।
- DESC भूलना। इसके बिना आप Nth सबसे नीची पाते हैं, ऊँची नहीं।
सारांश
- Nth सबसे ऊँची: DISTINCT के साथ
ORDER BY salary DESC LIMIT 1 OFFSET N-1। - दूसरी सबसे ऊँची OFFSET 1 इस्तेमाल करती है।
- DISTINCT tied salaries collapse करता है ताकि ranks सही हों।
- DENSE_RANK (MySQL 8.0+) salaries rank करता है और साफ़ पढ़ता है।
- MAX वाली subquery दूसरी सबसे ऊँची साफ़ संभालती है।
आगे, data group और rank कीजिए GROUP BY और HAVING से, या duplicates हटाइए deleting duplicate rows में।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
MySQL में Nth सबसे ऊँची salary कैसे ढूँढूँ?
SELECT DISTINCT salary FROM employees ORDER BY salary DESC LIMIT 1 OFFSET N-1; है। Descending sort करके N-1 rows skip करना Nth सबसे ऊँची पर पहुँचता है। DISTINCT इस्तेमाल कीजिए ताकि बराबर salaries duplicates न बनाएँ।दूसरी सबसे ऊँची salary कैसे ढूँढूँ?
SELECT DISTINCT salary FROM employees ORDER BY salary DESC LIMIT 1 OFFSET 1;। यह top salary skip करके अगली distinct लौटाता है, जो दूसरी सबसे ऊँची है।Nth सबसे ऊँची salary ढूँढते समय DISTINCT क्यों?
DENSE_RANK तरीका क्या है?
WHERE rank = N filter करते हैं। यह MySQL 8.0 में उपलब्ध है और बहुत साफ़ है।