Heim >Datenbank >MySQL-Tutorial >Wie kann ich Spalten mit unterschiedlichen Filtern in PostgreSQL effizient aggregieren?

Wie kann ich Spalten mit unterschiedlichen Filtern in PostgreSQL effizient aggregieren?

Barbara Streisand
Barbara StreisandOriginal
2025-01-22 17:11:38784Durchsuche

How Can I Efficiently Aggregate Columns with Distinct Filters in PostgreSQL?

Effiziente PostgreSQL-Aggregationsspalte und eindeutiger Filter

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn