Memperkemas Pengagregatan Lajur dengan Penapis Berbeza dalam PostgreSQL
Kod berikut mengagregatkan data daripada berbilang jadual, menggunakan penapis yang berbeza untuk mengkategorikan permainan yang dimainkan, dimenangi dan kalah. Walaupun berfungsi, kerumitan dan panjangnya memerlukan pendekatan yang lebih cekap. Artikel ini meneroka kaedah yang lebih mudah.
Memanfaatkan Klausa FILTER
(PostgreSQL 9.4 dan lebih baru)
PostgreSQL 9.4 dan versi seterusnya menawarkan klausa SQL FILTER
standard, membolehkan penapisan dinamik dalam pengagregatan. Ini dengan ketara memudahkan pertanyaan:
<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>
Alternatif untuk Versi PostgreSQL Lama
Untuk versi sebelum PostgreSQL 9.4, penyelesaian menggunakan ungkapan Boolean dalam fungsi agregat tersedia:
<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>
Kaedah ini, walaupun kurang cekap daripada klausa FILTER
, menawarkan penyelesaian praktikal untuk pemasangan PostgreSQL yang lebih lama.
Ringkasan
Menggunakan klausa FILTER
(PostgreSQL 9.4 ) atau penyelesaian Boolean menyediakan penyelesaian yang lebih ringkas dan, dalam kebanyakan kes, penyelesaian berprestasi. Klausa FILTER
ialah pendekatan pilihan untuk versi yang lebih baharu kerana kebolehbacaan dan kecekapannya yang lebih baik. Untuk versi yang lebih lama, penyelesaian Boolean kekal sebagai alternatif yang berdaya maju.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memudahkan Agregat Lajur dengan Penapis Berbeza dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!