Juego un juego de baloncesto que permite generar sus estadísticas como un archivo de base de datos, para poder calcular estadísticas que no se implementan en el juego. Hasta ahora no he tenido problemas para calcular las estadísticas que quería, pero ahora me he encontrado con un problema: contar el número de dobles dobles y / o triples dobles que un jugador hizo durante la temporada a partir de las estadísticas de su juego.
La definición de doble doble y triple doble es la siguiente:
Doble doble:
Un doble doble se define como una actuación en la cual un jugador acumula un total de dos dígitos en dos de las cinco categorías estadísticas: puntos, rebotes, asistencias, robos y tiros bloqueados en un juego.
Triple doble:
Un triple-doble se define como una actuación en la que un jugador acumula un número total de dos dígitos en tres de las cinco categorías estadísticas (puntos, rebotes, asistencias, robos y tiros bloqueados) en un juego.
Cuádruple-doble (agregado para aclaración)
Un cuádruple-doble se define como una actuación en la que un jugador acumula un número total de dos dígitos en cuatro de cinco categorías estadísticas (puntos, rebotes, asistencias, robos y tiros bloqueados) en un juego.
La tabla "PlayerGameStats" almacena estadísticas de cada juego que juega un jugador y tiene el siguiente aspecto:
CREATE TABLE PlayerGameStats AS SELECT * FROM ( VALUES
( 1, 1, 1, 'Nuggets', 'Cavaliers', 6, 8, 2, 2, 0 ),
( 2, 1, 2, 'Nuggets', 'Clippers', 15, 7, 0, 1, 3 ),
( 3, 1, 6, 'Nuggets', 'Trailblazers', 11, 11, 1, 2, 1 ),
( 4, 1, 10, 'Nuggets', 'Mavericks', 8, 10, 2, 2, 12 ),
( 5, 1, 11, 'Nuggets', 'Knicks', 23, 12, 1, 0, 0 ),
( 6, 1, 12, 'Nuggets', 'Jazz', 8, 8, 11, 1, 0 ),
( 7, 1, 13, 'Nuggets', 'Suns', 7, 11, 2, 2, 1 ),
( 8, 1, 14, 'Nuggets', 'Kings', 10, 15, 0, 3, 1 ),
( 9, 1, 15, 'Nuggets', 'Kings', 9, 7, 5, 0, 4 ),
(10, 1, 17, 'Nuggets', 'Thunder', 13, 10, 10, 1, 0 )
) AS t(id,player_id,seasonday,team,opponent,points,rebounds,assists,steals,blocks);
El resultado que quiero lograr se ve así:
| player_id | team | doubleDoubles | tripleDoubles |
|-----------|---------|---------------|---------------|
| 1 | Nuggets | 4 | 1 |
La única solución que encontré hasta ahora es tan horrible que me hace vomitar ...; o) ... Se ve así:
SELECT
player_id,
team,
SUM(CASE WHEN(points >= 10 AND rebounds >= 10) OR
(points >= 10 AND assists >= 10) OR
(points >= 10 AND steals >= 10)
THEN 1
ELSE 0
END) AS doubleDoubles
FROM PlayerGameStats
GROUP BY player_id
... y ahora probablemente también estás vomitando (o riéndote fuerte) después de leer esto. Ni siquiera escribí todo lo que se necesitaría para obtener todas las combinaciones dobles dobles, y omití la declaración del caso para los dobles triples porque es aún más ridículo.
¿Hay una mejor manera de hacer esto? Ya sea con la estructura de tabla que tengo o con una nueva estructura de tabla (podría escribir un script para convertir la tabla).
Puedo usar MySQL 5.5 o PostgreSQL 9.2.
Aquí hay un enlace a SqlFiddle con datos de ejemplo y mi horrible solución que publiqué anteriormente: http://sqlfiddle.com/#!2/af6101/3
Tenga en cuenta que no estoy realmente interesado en los dobles cuádruples (ver arriba) ya que no ocurren en el juego que juego hasta donde yo sé, pero sería una ventaja si la consulta se puede expandir fácilmente sin tener que volver a escribir en la cuenta para dobles cuádruples.