2012-03-16 15 views
6

में प्रत्येक विशिष्ट रिकॉर्ड के लिए अधिकतम औसत प्राप्त करें मेरे पास कुछ टेबल हैं जिनमें खिलाड़ियों और उनके लीग के दौरान गेंदबाजी केंद्र में इस सीजन में गेंदबाजी के बारे में डेटा शामिल है। पुरुषों और महिलाओं के लिए इस वर्ष शीर्ष एक्स औसत को क्रमबद्ध करने के लिए इस विशेष प्रश्न का उपयोग किया जाता है। मेरे पास यह सब नीचे है, लेकिन मुझे अभी भी कुछ विशेष मामले में समस्या है जब कुछ खिलाड़ी कई लीग में खेलते हैं और शीर्ष एक्सSQL क्वेरी

स्पष्ट रूप से, मैं केवल सर्वश्रेष्ठ सूचीबद्ध करना चाहता हूं किसी दिए गए खिलाड़ी के लिए औसत, इसलिए यदि लीग एबीसी में 200 के साथ प्लेयर ए के साथ सबसे अच्छा औसत है और लीग डीईएफ में 198 के साथ दूसरा सबसे अच्छा औसत है, तो मुझे केवल 200 सूचीबद्ध करना चाहिए।

यहां क्वेरी का सरलीकृत संस्करण है जिसे मैं बदलना चाहता हूं, क्योंकि अभी मुझे मैन्युअल रूप से डुप्लिकेट को हटाना होगा या मुझे दूसरी भाषा में सॉर्टर लिखना होगा, लेकिन मैं इसे शुद्ध एसक्यूएल में करना चाहता हूं । (मैं केवल इस उदाहरण के लिए क्वेरी से अप्रासंगिक जानकारी हटा दिया):

SELECT playerId, ROUND(AVG(score),2)Average, season, leagueName, COUNT(score)NumGames FROM Scores 
WHERE season = '2011-2012' AND score > -1 
GROUP BY season, playerID, leagueName 
ORDER BY Average DESC LIMIT 0,30 

असल में, Scores तालिका प्रत्येक व्यक्ति के खेल, एक playerId, मौसम, जिसमें खेल खेला गया था और leagueName (और अन्य स्तंभ हैं कि इस उदाहरण में आवश्यक नहीं हैं)।

WHERE यह सुनिश्चित करना है कि गेम इस मौसम में खेला गया था और स्कोर सकारात्मक है (-1 जब लोग अनुपस्थित हैं)। मैं सीजन, प्लेयरआईडी और लीग नाम से सब कुछ समूहित करता हूं इसलिए मुझे अलग-अलग लीग में खेले जाने वाले सभी खेलों के औसत के बजाय प्रत्येक खिलाड़ी के लिए औसत प्रति लीग प्राप्त होता है।

मैंने DISTINCT कीवर्ड का उपयोग करने का प्रयास किया, लेकिन यह काम नहीं करता है क्योंकि मैं केवल एक कॉलम के लिए DISTINCT का उपयोग नहीं कर सकता। मैंने अन्य चीजों की भी कोशिश की लेकिन उनमें से कोई भी काम करने के करीब भी नहीं आया, इसलिए मैं सोच रहा हूं कि ऐसा करने के लिए भी संभव है या अगर मुझे इस परिणाम को सेट करने और डुप्लिकेट को हटाने के लिए किसी अन्य भाषा का उपयोग करना होगा?

उत्तर

3

आप एक सबक्वेरी में लीग प्रति खिलाड़ी प्रति औसत की गणना कर सकते हैं:

select playerId 
,  max(league_avg.score) 
from (
     select playerId 
     ,  avg(score) as score 
     from Scores 
     where season = '2011-2012' 
       and score > -1 
     group by 
       playerId 
     ,  leagueName 
     ) as league_avg 
group by 
     playerId 
+0

बहुत अच्छा, यह मेरा पसंदीदा उत्तर है क्योंकि यह अस्थायी तालिकाओं की आवश्यकता के बिना एक ही प्रश्न में काम करता है। अनेक अनेक धन्यवाद! –

1

ठीक है, यह एक चुनौती है। मुझे लगता है कि आप एक टेम्पलेट टेबल उत्पन्न करने के लिए SELECT xxx INTO तालिका का उपयोग कर सकते हैं? उस स्थिति में, ये दो चयन आपको प्राप्त करेंगे जो आप चाहते हैं:

सबसे पहले, मैं ऊपर आपकी क्वेरी को टीएमपीएसकोर्स नामक एक टेबल बना रहा हूं।

select playerID, MAX(average) AS bestscore 
INTO bestscores 
FROM tmpscores 
GROUP BY playerID, season 

अंत में bestscores लेने के लिए और अस्थायी स्कोर फिर से शामिल उचित लीग और खेल की संख्या प्राप्त करने,:

तो फिर तुम प्राप्त करने के लिए, प्रत्येक खिलाड़ी, सबसे अच्छा स्कोर के लिए की जरूरत है

SELECT bs.playerId, bs.bestscore, ts.season, ts.leaguename, ts.numgames 
    FROM bestscores bs 
    JOIN tmpscores ts ON bs.playerID = ts.playerId and bs.bestscore = ts.average 

वहाँ! एसक्यूएल में सभी।

उम्मीद है कि यह मदद करता है!

+0

यह बहुत अच्छा है, मैं इसे, काम हालांकि मैं कुछ चीजें बदलना पड़ा मिला है। मैंने अपने प्रश्न में क्वेरी के साथ tmpScores बनाया, फिर "INTO bestScores" से पहले अपनी पहली SQL क्वेरी क्वेरी का उपयोग किया और केवल SELECT में आवश्यक फ़ील्ड जोड़े, क्योंकि tmpScores में पहले से मौजूद सभी डेटा शामिल हैं। धन्यवाद एक टन, यह वास्तव में मेरी मदद की :) –

+0

खुशी है कि यह आपके लिए @Adam काम किया! –