Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mengagregatkan Lajur dengan Penapis Berbeza dengan Cekap dalam PostgreSQL?

Bagaimanakah Saya Boleh Mengagregatkan Lajur dengan Penapis Berbeza dengan Cekap dalam PostgreSQL?

Barbara Streisand
Barbara Streisandasal
2025-01-22 17:11:38785semak imbas

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

Lajur pengagregatan cekap PostgreSQL dan penapis Distinct

Kod berikut mendapatkan semula data untuk tiga lajur agregat berasingan: permainan yang dimainkan, permainan yang dimenangi dan permainan yang kalah. Walaupun kod ini berfungsi seperti yang diharapkan, ia berulang dan berkemungkinan sukar untuk dikekalkan. Untuk memudahkan pertanyaan ini, pertimbangkan untuk menggunakan ciri PostgreSQL lanjutan.

PostgreSQL 9.4 dan lebih tinggi

PostgreSQL 9.4 memperkenalkan klausa FILTER agregat baharu. Klausa ini membenarkan anda menggunakan penapis pada pengiraan agregat, dengan mengambil kira hanya baris yang memenuhi ungkapan Boolean yang ditentukan.

<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>

Versi PostgreSQL sebelum 9.4

Untuk versi PostgreSQL yang lebih awal, anda boleh menggunakan ungkapan (ungkapan ATAU NULL) sebagai penyelesaian.

<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>

Penyelesaian ini lebih pendek dan lebih pantas daripada menggunakan subpilihan bersarang atau ungkapan CASE. Untuk pertimbangan pengoptimuman lanjut, lihat rujukan yang dinyatakan dalam jawapan yang disediakan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengagregatkan Lajur dengan Penapis Berbeza dengan Cekap dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn