Der folgende Code zählt die Anzahl der von jedem Spieler gespielten, gewonnenen und verlorenen Spiele. Seine Länge und Komplexität stellen jedoch Herausforderungen dar. Wie können wir diese Abfrage vereinfachen?
Verwenden Sie die FILTER
-Klausel, um Aggregationen basierend auf einem booleschen Ausdruck zu filtern:
<code class="language-sql">SELECT u.name, COUNT(*) FILTER (WHERE g.winner_id > 0) AS played, COUNT(*) FILTER (WHERE g.winner_id = u.id) AS won, COUNT(*) FILTER (WHERE g.winner_id <> u.id) AS lost FROM games g JOIN users u ON u.id IN (g.player_1_id, g.player_2_id) GROUP BY u.name;</code>
Emphasis PostgreSQL 9.4 führte die FILTER
-Klausel ein. Für ältere Versionen gibt es einen Workaround:
<code class="language-sql">SELECT u.name, COUNT(CASE WHEN g.winner_id > 0 THEN 1 END) AS played, COUNT(CASE WHEN g.winner_id = u.id THEN 1 END) AS won, COUNT(CASE WHEN g.winner_id <> u.id THEN 1 END) AS lost FROM games g JOIN users u ON u.id IN (g.player_1_id, g.player_2_id) GROUP BY u.name;</code>
Hinweis: Die Lösung für ältere Versionen von PostgreSQL verwendet die CASE
-Anweisung anstelle der FILTER
-Klausel, um den gleichen Effekt zu erzielen. Beide Methoden berechnen die Spielstatistiken eines Spielers genau, aber die FILTER
-Klausel hat den Vorteil, dass sie besser lesbar und wartbar ist.
Das obige ist der detaillierte Inhalt vonWie kann ich die Aggregation von Spielstatistiken mit unterschiedlichen Filtern in PostgreSQL vereinfachen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!