Eu jogo um jogo de basquete que permite exibir suas estatísticas como um arquivo de banco de dados, para que possamos calcular estatísticas que não foram implementadas no jogo. Até agora, não tive nenhum problema em calcular as estatísticas que queria, mas agora me deparei com um problema: contar o número de duplos duplos e / ou triplos duplos que um jogador fez ao longo da temporada a partir de suas estatísticas de jogo.
A definição de um duplo duplo e um triplo duplo é a seguinte:
Dobro dobro:
Um duplo duplo é definido como um desempenho no qual um jogador acumula um total de dois dígitos em duas das cinco categorias estatísticas - pontos, rebotes, assistências, roubadas de bola e bloqueios - em um jogo.
Triplo duplo:
Um triplo-duplo é definido como um desempenho no qual um jogador acumula um total de dois dígitos em três das cinco categorias estatísticas - pontos, rebotes, assistências, roubadas de bola e bloqueios - em um jogo.
Quádruplo-duplo (adicionado para esclarecimento)
Um quádruplo-duplo é definido como um desempenho no qual um jogador acumula um total de dois dígitos em quatro das cinco categorias estatísticas - pontos, rebotes, assistências, roubadas de bola e bloqueios - em um jogo.
A tabela "PlayerGameStats" armazena estatísticas para cada jogo que um jogador joga e tem a seguinte aparência:
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);
A saída que eu quero alcançar é assim:
| player_id | team | doubleDoubles | tripleDoubles |
|-----------|---------|---------------|---------------|
| 1 | Nuggets | 4 | 1 |
A única solução que encontrei até agora é tão terrível que me faz vomitar ...; o) ... É assim:
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
... e agora você provavelmente também está vomitando (ou rindo muito) depois de ler isso. Eu nem escrevi tudo o que seria necessário para obter todas as combinações de duplo duplo e omiti a declaração de caso dos duplos triplos porque é ainda mais ridículo.
Existe uma maneira melhor de fazer isso? Com a estrutura da tabela que eu tenho ou com uma nova estrutura da tabela (eu poderia escrever um script para converter a tabela).
Eu posso usar o MySQL 5.5 ou PostgreSQL 9.2.
Aqui está um link para o SqlFiddle com dados de exemplo e minha péssima solução que eu publiquei acima: http://sqlfiddle.com/#!2/af6101/3
Observe que não estou realmente interessado em duplos quádruplos (veja acima), pois eles não ocorrem no jogo que eu jogo até onde eu sei, mas seria uma vantagem se a consulta fosse facilmente expansível sem muita reescrita na conta para quádruplos-duplos.