Gioco a una partita di basket che consente di visualizzare le sue statistiche come file di database, in modo da poter calcolare statistiche che non sono implementate nel gioco. Finora non ho avuto alcun problema nel confermare le statistiche che volevo, ma ora ho riscontrato un problema: contare il numero di doppie doppie e / o triple che un giocatore ha guadagnato durante la stagione dalle sue statistiche di gioco.
La definizione di una doppia doppia e una doppia tripla è la seguente:
Doppia-doppia:
Una doppia doppia è definita come una prestazione in cui un giocatore accumula un totale di due cifre in due delle cinque categorie statistiche (punti, rimbalzi, assist, ruba e tiri bloccati) in una partita.
Tripla-doppia:
Una tripla doppia è definita come una prestazione in cui un giocatore accumula un totale di numeri a due cifre in tre delle cinque categorie statistiche (punti, rimbalzi, assist, ruba e tiri bloccati) in una partita.
Quadrupla doppia (aggiunta per chiarimenti)
Una doppia quadrupla è definita come una prestazione in cui un giocatore accumula un totale di due cifre in quattro delle cinque categorie statistiche (punti, rimbalzi, assist, ruba e tiri bloccati) in una partita.
La tabella "PlayerGameStats" memorizza le statistiche per ogni gioco a cui un giocatore gioca e ha il seguente aspetto:
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);
L'output che voglio ottenere è simile al seguente:
| player_id | team | doubleDoubles | tripleDoubles |
|-----------|---------|---------------|---------------|
| 1 | Nuggets | 4 | 1 |
L'unica soluzione che ho trovato finora è così terribile che mi fa vomitare ...; o) ... Sembra così:
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 ora probabilmente stai anche vomitando (o ridendo forte) dopo aver letto questo. Non ho nemmeno scritto tutto ciò che sarebbe necessario per ottenere tutte le doppie doppie combinazioni, e ho omesso l'istruzione case per le triple doppie perché è ancora più ridicola.
C'è un modo migliore per farlo? O con la struttura della tabella che ho o con una nuova struttura della tabella (potrei scrivere uno script per convertire la tabella).
Posso usare MySQL 5.5 o PostgreSQL 9.2.
Ecco un link a SqlFiddle con i dati di esempio e la mia terribile soluzione che ho pubblicato sopra: http://sqlfiddle.com/#!2/af6101/3
Nota che non mi interessa molto il doppio quadruplo (vedi sopra) poiché non si verificano nel gioco a cui gioco, per quanto ne so, ma sarebbe un vantaggio se la query fosse facilmente espandibile senza riscrivere molto sull'account per quadruple doppie.