2012-03-16 14 views
6

Mam kilka tabel, które zawierają dane o graczach i grach, w które oni grali w tym sezonie w kręgielni podczas swoich lig. To, do czego służy ta konkretna kwerenda, to sortowanie najlepszych średnich w tym roku dla mężczyzn i kobiet. Mam to wszystko, ale nadal mam problem w pewnym szczególnym przypadku, gdy niektórzy gracze grają w wielu ligach i mają więcej niż jedną z ich średnich w topowym X.Zdobądź maksymalną średnią dla każdego odrębnego rekordu w zapytaniu SQL

Oczywiście, chcę tylko wymienić najlepszych średnia dla danego gracza, więc jeśli gracz A ma najlepszą średnią z 200 w League ABC, a także drugą średnią z 198 w League DEF, chcę tylko 200 wymienionych.

Oto uproszczona wersja zapytania, którą chciałbym zmienić, ponieważ w tej chwili muszę ręcznie usunąć duplikaty lub musiałbym napisać sorter w innym języku, ale wolałbym to zrobić w czystym SQL . (I tylko usuwane nieistotne informacje z kwerendy w tym przykładzie):

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 

Zasadniczo, stół Scores zawiera każdy indywidualny gry, playerid, sezon, w którym gra i gra się leagueName (i innych kolumn nie są wymagane w tym przykładzie).

The WHERE jest upewnienie się, że gra została rozegrana w tym sezonie, i że wynik jest pozytywny (-1 jest, gdy ludzie są nieobecni). Grupuję wszystko według sezonu, playerID i leagueName, więc otrzymuję średnią PER LEAGUE dla każdego gracza zamiast średniej wszystkich gier rozgrywanych w różnych ligach.

Próbowałem użyć słowa kluczowego DISTINCT, ale to nie działa, ponieważ nie mogę użyć DISTINCT tylko dla jednej kolumny. Próbowałem także innych rzeczy, ale żadna z nich nie była nawet bliska pracy, więc zastanawiam się, czy to nawet możliwe, czy będę musiał użyć innego języka do sortowania tego zestawu wyników i usuwania duplikatów?

Odpowiedz

3

Można obliczyć średnią na gracza za ligi w podkwerendzie:

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

Bardzo dobra, jest to moja preferowana odpowiedź, ponieważ działa w pojedynczej kwerendzie bez potrzeby stosowania tabel tymczasowych. Dzięki za tonę! –

1

OK, to trochę wyzwanie. Zakładam, że możesz użyć tabeli SELECT xxx INTO do wygenerowania tabeli tymczasowej? W takim przypadku te dwa selekcje dostarczy Ci to, co chcesz:

Po pierwsze, zakładam, że twoje zapytanie powyżej wykonane tabeli o nazwie Tmpscores.

Następnie trzeba uzyskać, dla każdego gracza, najlepsze wyniki:

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

Wreszcie podejmuje bestscores i ponownie połączyć wyniki tymczasowe, aby uzyskać właściwą ligę i liczba gier:

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 

There! Wszystko w SQL.

Mam nadzieję, że pomoże!

+0

To jest wielki, mam to działa, choć musiałem zmienić kilka rzeczy. Stworzyłem tmpScores z zapytaniem w moim pytaniu, następnie użyłem twojego pierwszego zapytania SQL minus "INTO bestScores" i właśnie dodałem pola, które potrzebowałem w SELECT, ponieważ tmpScores zawiera już wszystkie potrzebne dane. Wielkie dzięki, to naprawdę mi pomogło :) –

+0

Cieszę się, że zadziałało dla ciebie @Adam! –

Powiązane problemy