Mengoptimumkan Pertanyaan dengan FILTER dan Pengagregatan Bersyarat
Pelajari cara klausa FILTER dan pengagregatan bersyarat berasaskan CASE membolehkan anda mengira berbilang metrik dalam satu laluan jadual, bukannya menjalankan beberapa pertanyaan berasingan.
Mengoptimumkan Pertanyaan dengan FILTER dan Pengagregatan Bersyarat ialah pelajaran Prestasi PostgreSQL & Pengoptimuman Pertanyaan percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Prestasi PostgreSQL & Pengoptimuman Pertanyaan, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Prestasi PostgreSQL & Pengoptimuman Pertanyaan merangkumi sejumlah 4 pelajaran.
Masalahnya: Banyak Kiraan, Satu Jadual
Papan pemuka sering memerlukan beberapa metrik daripada jadual yang sama — jumlah pesanan, pesanan berbayar dan pesanan yang dipulangkan. Menjalankan tiga pertanyaan berasingan mengimbas jadual tiga kali. Kita boleh melakukannya dalam satu laluan.
Pengagregatan Bersyarat dengan CASE
Helah klasiknya ialah membungkus CASE di dalam agregat. Baris yang tidak sepadan menyumbang NULL, yang diabaikan oleh COUNT dan SUM.
SELECT
COUNT(*) AS total,
COUNT(CASE WHEN status = 'paid' THEN 1 END) AS paid
FROM orders;Klausa FILTER yang Lebih Kemas
PostgreSQL menawarkan bentuk yang lebih mudah dibaca: klausa FILTER yang dilampirkan pada mana-mana agregat. Klausa ini menyatakan maksud secara langsung.
SELECT
COUNT(*) AS total,
COUNT(*) FILTER (WHERE status = 'paid') AS paid,
COUNT(*) FILTER (WHERE status = 'refunded') AS refunded
FROM orders;Mengapa Ini Lebih Pantas
Semua metrik dikira dalam satu imbasan jadual. Perancang membaca setiap baris sekali dan mengemas kini setiap agregat, bukannya mengimbas jadual secara berasingan untuk setiap metrik.
FILTER dengan SUM dan AVG
FILTER berfungsi dengan mana-mana agregat, bukan COUNT sahaja. Kira jumlah dan purata bersyarat dalam pertanyaan yang sama.
SELECT
SUM(total) FILTER (WHERE status = 'paid') AS revenue,
AVG(total) FILTER (WHERE status = 'paid') AS avg_paid
FROM orders;Menggabungkan dengan GROUP BY
FILTER amat berguna dalam pertanyaan berkumpulan, lalu menghasilkan hasil seperti pangsi dengan satu baris bagi setiap kumpulan dan beberapa lajur bersyarat.
SELECT
region,
COUNT(*) FILTER (WHERE status = 'paid') AS paid,
COUNT(*) FILTER (WHERE status = 'refunded') AS refunded
FROM orders
GROUP BY region;Memangsimkan Bulan Menjadi Lajur
Laporan biasa menukar baris menjadi lajur. FILTER menghasilkan pangsi bulanan yang kemas tanpa fungsi sambungan.
SELECT
product_id,
SUM(total) FILTER (WHERE month = 1) AS jan,
SUM(total) FILTER (WHERE month = 2) AS feb
FROM sales
GROUP BY product_id;Membaca Pelan
EXPLAIN ANALYZE mengesahkan satu nod Aggregate di atas satu imbasan. Bandingkan dengan tiga pertanyaan berasingan untuk melihat imbasan yang dijimatkan.
EXPLAIN ANALYZE
SELECT
COUNT(*) FILTER (WHERE status = 'paid') AS paid,
COUNT(*) FILTER (WHERE status = 'refunded') AS refunded
FROM orders;FILTER berbanding WHERE
Ingat perbezaannya:
- WHERE membuang baris sebelum mana-mana agregat melihatnya
- FILTER mengekalkan semua baris tetapi mengehadkan baris yang dikira oleh agregat tertentu
Gunakan FILTER apabila agregat yang berbeza memerlukan syarat yang berbeza.
Menggabungkan dengan Indeks
Jika kebanyakan metrik menyasarkan subset (contohnya, hanya baris terkini), tambahkan WHERE untuk syarat yang dikongsi supaya indeks mengecilkan imbasan, kemudian gunakan FILTER untuk pemisahan bagi setiap metrik.
SELECT
COUNT(*) FILTER (WHERE status = 'paid') AS paid
FROM orders
WHERE created_at >= now() - interval '30 days';Mengira Nilai Berbeza Secara Bersyarat
FILTER juga boleh digandingkan dengan COUNT(DISTINCT ...), lalu membolehkan anda mengira pelanggan unik bagi setiap status dalam satu imbasan dan bukannya beberapa pertanyaan berkumpulan.
SELECT
COUNT(DISTINCT customer_id) FILTER (WHERE status = 'paid') AS paying_customers
FROM orders;Semakan Pantas
Uji pengetahuan anda tentang pengagregatan bersyarat.
Rumusan
Anda telah mempelajari pengagregatan bersyarat:
- Kira banyak metrik dalam satu imbasan dengan FILTER atau CASE
- FILTER lebih mudah dibaca dan berfungsi dengan mana-mana agregat
- Gabungkan dengan GROUP BY untuk laporan bergaya pangsi
- WHERE membuang baris; FILTER mengehadkan satu agregat
- Tambahkan WHERE yang dikongsi supaya indeks mengecilkan imbasan
Pelajari SQL dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 22
- Pelajaran
- 88
Soalan Lazim
Adakah pelajaran “Mengoptimumkan Pertanyaan dengan FILTER dan Pengagregatan Bersyarat” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Prestasi PostgreSQL & Pengoptimuman Pertanyaan, termasuk “Mengoptimumkan Pertanyaan dengan FILTER dan Pengagregatan Bersyarat”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Prestasi PostgreSQL & Pengoptimuman Pertanyaan merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Mengoptimumkan Pertanyaan dengan FILTER dan Pengagregatan Bersyarat”?
Pelajari cara klausa FILTER dan pengagregatan bersyarat berasaskan CASE membolehkan anda mengira berbilang metrik dalam satu laluan jadual, bukannya menjalankan beberapa pertanyaan berasingan. Anda berlatih Prestasi PostgreSQL & Pengoptimuman Pertanyaan menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Prestasi PostgreSQL & Pengoptimuman Pertanyaan?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Prestasi PostgreSQL & Pengoptimuman Pertanyaan di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “Mengoptimumkan Pertanyaan dengan FILTER dan Pengagregatan Bersyarat” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Prestasi PostgreSQL & Pengoptimuman Pertanyaan ini?
Ya. Setiap pelajaran Prestasi PostgreSQL & Pengoptimuman Pertanyaan menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Mengoptimumkan Agregat dan Fungsi Tetingkap
- CTE Rekursif dan Pertanyaan Graf
- Menggunakan Pandangan Terwujud untuk Prestasi
- Mengoptimumkan Pertanyaan dengan FILTER dan Pengagregatan Bersyarat