Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mengagregatkan Lajur dengan Penapis Berbeza dengan Cekap dalam PostgreSQL?
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!