2012-03-16 26 views
6

Tengo algunas tablas que contienen datos sobre los jugadores y los juegos que han jugado esta temporada en una bolera durante sus ligas. Para qué se utiliza esta consulta en particular, es para ordenar los promedios principales de X este año para hombres y para mujeres. Tengo todo esto abajo, pero todavía tengo un problema en algunos casos particulares cuando algunos jugadores juegan en múltiples ligas y tienen más de uno de sus promedios en la parte superior X.Obtenga el promedio máximo para cada registro distinto en una consulta SQL

Obviamente, solo quiero enumerar las mejores promedio para un jugador dado, así que si el Jugador A tiene el mejor promedio con 200 en la Liga ABC y también el segundo mejor promedio con 198 en la Liga DEF, solo quiero que aparezca el 200.

Aquí hay una versión simplificada de la consulta que me gustaría cambiar, porque ahora tengo que eliminar los duplicados manualmente o tendría que escribir un clasificador en otro idioma, pero preferiría hacerlo en SQL puro . (I sólo se elimina la información irrelevante de la consulta para este ejemplo):

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 

Básicamente, la mesa Scores contiene cada juego individual, un playerId, la temporada en la que se jugó el juego y el leagueName (y otras columnas que no son necesarios en este ejemplo).

El WHERE es para asegurarse de que el juego se jugó esta temporada y que el puntaje es positivo (-1 es para cuando las personas están ausentes). Agrupo todo por temporada, playerID y leagueName, así que obtengo un promedio de PER LEAGUE para cada jugador en lugar de un promedio de todos los juegos jugados en diferentes ligas.

He intentado utilizar la palabra clave DISTINCT, pero eso no funciona porque no puedo usar DISTINCT para una sola columna. También probé otras cosas, pero ninguna de ellas estuvo cerca de funcionar, así que me pregunto si es posible hacerlo o si tendré que recurrir a usar otro idioma para ordenar este conjunto de resultados y eliminar duplicados.

Respuesta

3

Se podría calcular el promedio por jugador liga en una subconsulta:

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

Muy bien, esta es mi respuesta preferida, ya que funciona en una sola consulta sin la necesidad de tablas temporales. ¡Gracias una tonelada! –

1

Bueno, esto es un desafío. Supongo que puede usar la tabla SELECT xxx INTO para generar una tabla temporal. En ese caso, estas dos selecciones le darán lo que quiere:

En primer lugar, supongo que su consulta anterior creó una tabla llamada tmpscores.

Luego hay que obtener, para cada jugador, las mejores puntuaciones:

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

Por último, tome las bestscores y volver a unirse a las puntuaciones temporales para conseguir la liga adecuada y el número de juegos:

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 

¡Allí! Todo en SQL.

Espero que ayude!

+0

Esto es muy bueno, lo tengo trabajo, a pesar de que tenía que cambiar algunas cosas. Creé tmpScores con la consulta en mi pregunta, luego usé tu primera consulta SQL menos el "INTO bestScores" y acabo de agregar los campos que necesitaba en SELECT, ya que tmpScores ya contiene todos los datos que necesito. Muchas gracias, esto realmente me ayudó :) –

+0

Me alegro de que funcionó para usted @Adam! –

Cuestiones relacionadas