Der folgende Code ruft Daten für drei separate Aggregatspalten ab: gespielte Spiele, gewonnene Spiele und verlorene Spiele. Obwohl dieser Code wie erwartet funktioniert, ist er repetitiv und möglicherweise schwierig zu warten. Um diese Abfrage zu vereinfachen, sollten Sie die Verwendung erweiterter PostgreSQL-Funktionen in Betracht ziehen.
PostgreSQL 9.4 und höher
PostgreSQL 9.4 führt eine neue Aggregat-FILTER-Klausel ein. Mit dieser Klausel können Sie einen Filter auf eine Aggregatberechnung anwenden und dabei nur Zeilen berücksichtigen, die den angegebenen booleschen Ausdruck erfüllen.
<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>
PostgreSQL-Versionen vor 9.4
Für frühere Versionen von PostgreSQL können Sie als Problemumgehung Ausdruck (Ausdruck ODER NULL) verwenden.
<code class="language-sql">SELECT u.name , count(g.winner_id > 0 OR NULL) AS played , count(g.winner_id = u.id OR NULL) AS won , count(g.winner_id != u.id OR NULL) 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 Problemumgehung ist kürzer und schneller als die Verwendung verschachtelter Unterauswahlen oder CASE-Ausdrücke. Weitere Optimierungsüberlegungen finden Sie in den in den bereitgestellten Antworten genannten Referenzen.
Das obige ist der detaillierte Inhalt vonWie kann ich Spalten mit unterschiedlichen Filtern in PostgreSQL effizient aggregieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!