2012-03-16 17 views
6

Ho alcune tabelle che contengono dati sui giocatori e i giochi che hanno lanciato questa stagione in un centro di bowling durante i loro campionati. Ciò che questa particolare query viene utilizzata è quella di ordinare le medie X in alto quest'anno per gli uomini e per le donne. Ho tutto questo giù, ma ho ancora un problema in alcuni casi particolari quando alcuni giocatori giocano in più leghe e hanno più di una delle loro medie nella top X.Ottieni una media massima per ogni record distinto in una query SQL

Ovviamente, voglio solo elencare il migliore media per un dato giocatore, quindi se il giocatore A ha la media migliore con 200 in League ABC e anche la seconda media migliore con 198 in League DEF, voglio solo i 200 elencati.

Ecco una versione semplificata della query che vorrei modificare, perché adesso devo rimuovere i duplicati manualmente o dovrei scrivere un sorter in un'altra lingua, ma preferirei farlo in puro SQL . (Ho tolto solo informazioni irrilevanti dalla query per questo esempio):

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 

In sostanza, la tabella Scores contiene ogni singolo gioco, un playerid, la stagione in cui il gioco è stato giocato e il leagueName (e altre colonne che non sono richiesti in questo esempio).

Il WHERE è quello di assicurarsi che il gioco è stato giocato in questa stagione e che il punteggio è positivo (-1 è per quando le persone sono assenti). Io raggruppo tutto per stagione, playerID e leagueName, quindi ottengo una media di LEAGUE per ogni giocatore invece di una media di tutte le partite giocate in diversi campionati.

Ho provato a utilizzare la parola chiave DISTINCT, ma non funziona perché non è possibile utilizzare DISTINCT per una sola colonna. Ho provato anche altre cose, ma nessuna di esse è arrivata a lavorare, quindi mi chiedo se è possibile farlo o se dovrò ricorrere a un'altra lingua per ordinare questo set di risultati e rimuovere i duplicati?

risposta

3

Si potrebbe calcolare la media per giocatore per ogni campionato in una sottoquery:

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

Molto bello, questa è la mia risposta preferita in quanto funziona in una singola query senza la necessità di tabelle temporanee. Grazie mille! –

1

OK, questa è una piccola sfida. Suppongo che tu possa usare la tabella SELECT xxx INTO per generare una tabella temporanea? In tal caso, queste due selezioni ti daranno quello che vuoi:

In primo luogo, sto assumendo che la tua query sopra abbia fatto una tabella chiamata tmpscores.

allora avete bisogno di ottenere, per ogni giocatore, i punteggi MIGLIORI:

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

Infine, prendere le bestscores e ri-unire i punteggi temporanei per ottenere la corretta campionato e numero di partite:

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 

Là! Tutto in SQL.

Spero che aiuti!

+0

Questo è grande, ho ottenuto che funziona, anche se ho dovuto cambiare alcune cose. Ho creato tmpScores con la query nella mia domanda, quindi ho usato la tua prima query SQL meno "INTO bestScores" e ho aggiunto solo i campi che avevo bisogno in SELECT, dal momento che tmpScores contiene già tutti i dati di cui ho bisogno. Grazie mille, questo mi ha davvero aiutato :) –

+0

Contento che ha funzionato per te @Adam! –

Problemi correlati