Ich spiele ein Basketballspiel, bei dem die Statistiken als Datenbankdatei ausgegeben werden können, sodass man daraus Statistiken berechnen kann, die nicht im Spiel implementiert sind. Bisher hatte ich keine Probleme, die von mir gewünschten Statistiken zu berechnen, aber jetzt bin ich auf ein Problem gestoßen: Zählen der Anzahl der doppelten und / oder dreifachen Doppelten, die ein Spieler im Laufe der Saison aus seinen Spielstatistiken gemacht hat.
Die Definition eines doppelten Doppelten und eines dreifachen Doppelten lautet wie folgt:
Doppel-Doppel:
Ein Double-Double ist eine Leistung, bei der ein Spieler eine zweistellige Gesamtsumme in zwei von fünf statistischen Kategorien - Punkte, Abpraller, Vorlagen, Diebstähle und geblockte Schüsse - in einem Spiel ansammelt.
Triple-Double:
Ein Triple-Double ist eine Leistung, bei der ein Spieler eine zweistellige Gesamtsumme in drei von fünf statistischen Kategorien - Punkte, Abpraller, Vorlagen, Diebstähle und geblockte Schüsse - in einem Spiel ansammelt.
Vierfach-Doppel (zur Verdeutlichung hinzugefügt)
Ein Vierfach-Doppel ist eine Leistung, bei der ein Spieler eine zweistellige Gesamtsumme in vier von fünf statistischen Kategorien - Punkte, Abpraller, Vorlagen, Diebstähle und geblockte Schüsse - in einem Spiel ansammelt.
Die "PlayerGameStats" -Tabelle speichert Statistiken für jedes Spiel, das ein Spieler spielt, und sieht folgendermaßen aus:
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);
Die Ausgabe, die ich erreichen möchte, sieht folgendermaßen aus:
| player_id | team | doubleDoubles | tripleDoubles |
|-----------|---------|---------------|---------------|
| 1 | Nuggets | 4 | 1 |
Die einzige Lösung, die ich bisher gefunden habe, ist so schrecklich, dass ich kotze ...; o) ... Es sieht so aus:
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
... und jetzt kotzen (oder lachen) Sie wahrscheinlich auch, nachdem Sie dies gelesen haben. Ich habe nicht einmal alles aufgeschrieben, was nötig wäre, um alle Double-Double-Kombinationen zu erhalten, und die case-Anweisung für die Triple-Double weggelassen, weil sie noch lächerlicher ist.
Gibt es einen besseren Weg, dies zu tun? Entweder mit der Tabellenstruktur, die ich habe, oder mit einer neuen Tabellenstruktur (ich könnte ein Skript schreiben, um die Tabelle zu konvertieren).
Ich kann MySQL 5.5 oder PostgreSQL 9.2 verwenden.
Hier ist ein Link zu SqlFiddle mit Beispieldaten und meiner schrecklichen Lösung, die ich oben gepostet habe: http://sqlfiddle.com/#!2/af6101/3
Beachten Sie, dass ich nicht wirklich an Vierfach-Doppel interessiert bin (siehe oben), da sie meines Wissens nicht in dem Spiel vorkommen, das ich spiele, aber es wäre ein Plus, wenn die Abfrage leicht erweiterbar wäre, ohne viel umzuschreiben für Vierbettzimmer.