Der ursprüngliche Code zur Aggregation von Spielstatistiken ist zu komplex. Dieser überarbeitete Ansatz vereinfacht den Prozess beim Abrufen von Spielernamen und der Anzahl ihrer Spiele (gespielt, gewonnen und verloren).
PostgreSQL 9.4 und höher (unter Verwendung der FILTER
-Klausel)
PostgreSQL 9.4 und spätere Versionen bieten eine elegante Lösung mit der FILTER
-Klausel:
<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>
Die FILTER
-Klausel wendet Bedingungen effizient auf die Aggregatfunktionen an und verbessert so die Lesbarkeit und Leistung.
PostgreSQL Alle Versionen (Problemumgehung)
Für ältere PostgreSQL-Versionen, denen die FILTER
-Klausel fehlt, erzielt diese Problemumgehung das gleiche Ergebnis:
<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>
Diese Methode verwendet bedingte Aggregation mit CASE
-Anweisungen, um die gewünschte Filterung zu erreichen. Obwohl sie in allen Versionen funktionsfähig ist, ist die FILTER
-Klausel (sofern verfügbar) aus Gründen der Klarheit und Effizienz die bevorzugte Methode.
Das obige ist der detaillierte Inhalt vonWie kann ich Spielstatistiken mit unterschiedlichen Filtern in PostgreSQL effizient aggregieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!