यहां केवल उन्हीं पंक्तियों को वापस करने के लिए SQL का उपयोग करने के लिए पांच विकल्प दिए गए हैं जिनका उनके समूह में अधिकतम मान है।
ये उदाहरण अधिकांश प्रमुख RDBMS में काम करते हैं, जिनमें MySQL, MariaDB, Oracle, PostgreSQL, SQLite और SQL Server शामिल हैं।
नमूना डेटा
मान लीजिए हमारे पास निम्न डेटा वाली एक तालिका है:
SELECT * FROM Gameshow;
परिणाम:
+--------------+--------+---------+ | Contestant | Game | Score | |--------------+--------+---------| | Faye | 1 | 85 | | Faye | 2 | 50 | | Faye | 3 | 63 | | Jet | 1 | 31 | | Jet | 2 | 40 | | Jet | 3 | 51 | | Spike | 1 | 25 | | Spike | 2 | 27 | | Spike | 3 | 15 | +--------------+--------+---------+
और मान लीजिए कि हम प्रत्येक प्रतियोगी के लिए उच्चतम अंक प्राप्त करना चाहते हैं।
Option 1
एक त्वरित और आसान विकल्प SQL GROUP BY
. के साथ एक क्वेरी बनाना है खंड:
SELECT
Contestant,
MAX( Score ) AS MaxScore
FROM Gameshow
GROUP BY Contestant
ORDER BY Contestant;
परिणाम:
+--------------+------------+ | Contestant | MaxScore | |--------------+------------| | Faye | 85 | | Jet | 51 | | Spike | 27 | +--------------+------------+
Option 2
यदि हम उस गेम को शामिल करना चाहते हैं जिसे प्रत्येक प्रतियोगी ने अधिकतम स्कोर प्राप्त करने के लिए खेला है, तो ऐसा करने का एक तरीका इस तरह से एक सहसंबद्ध सबक्वेरी का उपयोग करना है:
SELECT
Contestant,
Game,
Score
FROM Gameshow g1
WHERE Score = ( SELECT MAX( g2.Score )
FROM Gameshow g2
WHERE g1.Contestant = g2.Contestant )
ORDER BY Contestant;
परिणाम:
+--------------+--------+---------+ | Contestant | Game | Score | |--------------+--------+---------| | Faye | 1 | 85 | | Jet | 3 | 51 | | Spike | 2 | 27 | +--------------+--------+---------+
सहसंबद्ध उपश्रेणियाँ उपश्रेणी के बाहर से एक या अधिक स्तंभों को संदर्भित करती हैं। सहसंबद्ध उपश्रेणियाँ अक्षम हो सकती हैं, मुख्य रूप से इस तथ्य के कारण कि उपश्रेणी को बार-बार निष्पादित किया जाता है, प्रत्येक पंक्ति के लिए एक बार जिसे बाहरी क्वेरी द्वारा चुना जा सकता है। सहसंबद्ध उपश्रेणियों को दोहराई जाने वाली उपश्रेणियों के रूप में भी जाना जाता है।
Option 3
हम वैकल्पिक रूप से इस तरह एक असंबद्ध सबक्वेरी का उपयोग कर सकते हैं:
SELECT
g1.Contestant,
g1.Game,
g1.Score
FROM Gameshow g1
JOIN (
SELECT Contestant, MAX( Score ) AS Score
FROM Gameshow
GROUP BY Contestant ) AS g2
ON g1.Contestant = g2.Contestant AND g1.Score = g2.Score
ORDER BY Contestant ASC;
परिणाम:
+--------------+--------+---------+ | Contestant | Game | Score | |--------------+--------+---------| | Faye | 1 | 85 | | Jet | 3 | 51 | | Spike | 2 | 27 | +--------------+--------+---------+
असंबद्ध उपश्रेणियाँ उनके निष्पादन के लिए बाहरी क्वेरी पर निर्भर नहीं करती हैं। वे बाहरी क्वेरी से पूरी तरह स्वतंत्र रूप से निष्पादित कर सकते हैं।
Oracle में, हमें AS
. को हटाना होगा कॉलम उपनाम घोषित करते समय:
SELECT
g1.Contestant,
g1.Game,
g1.Score
FROM Gameshow g1
JOIN (
SELECT Contestant, MAX( Score ) Score
FROM Gameshow
GROUP BY Contestant ) g2
ON g1.Contestant = g2.Contestant AND g1.Score = g2.Score
ORDER BY Contestant ASC;
विकल्प 4
एक अन्य विकल्प LEFT JOIN
. का उपयोग करना है , इस तरह:
SELECT
g1.Contestant,
g1.Game,
g1.Score
FROM Gameshow g1
LEFT JOIN Gameshow g2 ON
g1.Contestant = g2.Contestant AND g1.Score < g2.Score
WHERE g2.Contestant IS NULL
ORDER BY g1.Contestant ASC;
परिणाम:
+--------------+--------+---------+ | Contestant | Game | Score | |--------------+--------+---------| | Faye | 1 | 85 | | Jet | 3 | 51 | | Spike | 2 | 27 | +--------------+--------+---------+
Option 5
किसी दिए गए कॉलम में अधिकतम मान वाली पंक्तियों को लाने का दूसरा तरीका विंडो फ़ंक्शन के साथ एक सामान्य तालिका अभिव्यक्ति का उपयोग करना है:
WITH cte AS (
SELECT Contestant, Game, Score,
RANK() OVER ( PARTITION BY Contestant
ORDER BY Score DESC
) AS r
FROM Gameshow
)
SELECT Contestant, Game, Score
FROM cte
WHERE r = 1
ORDER BY Contestant ASC;
परिणाम:
+--------------+--------+---------+ | Contestant | Game | Score | |--------------+--------+---------| | Faye | 1 | 85 | | Jet | 3 | 51 | | Spike | 2 | 27 | +--------------+--------+---------+