Pengiraan keadaan PostgreSQL: Perbandingan kecekapan antara pernyataan CASE dan FILTER
Kekerapan data berlaku dalam jadual statistik yang cekap adalah penting. PostgreSQL biasanya menggunakan pernyataan CASE untuk pengiraan bersyarat, tetapi kaedah ini menjadi rumit apabila bilangan nilai yang mungkin meningkat.
Gunakan SUM(KES BILA) untuk mengira:
<code class="language-sql">SELECT sum(CASE WHEN question1 = 0 THEN 1 ELSE 0 END) AS ZERO, sum(CASE WHEN question1 = 1 THEN 1 ELSE 0 END) AS ONE, sum(CASE WHEN question1 = 2 THEN 1 ELSE 0 END) AS TWO, category FROM reviews GROUP BY category</code>
Gunakan COUNT(KES BILA) untuk mengira:
<code class="language-sql">SELECT count(CASE WHEN question1 = 0 THEN 1 END) AS ZERO, count(CASE WHEN question1 = 1 THEN 1 END) AS ONE, count(CASE WHEN question1 = 2 THEN 1 END) AS TWO, category FROM reviews GROUP BY category</code>
Batasan penyata KES:
Walaupun kaedah ini boleh melaksanakan pengiraan bersyarat, kaedah ini mempunyai kelemahan:
Gunakan FILTER untuk mengoptimumkan pengiraan dalam versi PostgreSQL 9.4:
Untuk PostgreSQL 9.4 dan ke atas, pilihan pengagregatan FILTER menyediakan penyelesaian yang cekap:
<code class="language-sql">SELECT category , count(*) FILTER (WHERE question1 = 0) AS zero , count(*) FILTER (WHERE question1 = 1) AS one , count(*) FILTER (WHERE question1 = 2) AS two FROM reviews GROUP BY 1;</code>
Kaedah ini menggunakan klausa FILTER untuk menggunakan penapis yang berbeza, mengelakkan overhed penyata CASE tambahan.
Gunakan ATAU NULL untuk memudahkan sintaks:
Untuk lebih ringkas, anda boleh menggunakan ATAU NULL:
<code class="language-sql">SELECT category , count(question1 = 0 OR NULL) AS zero , count(question1 = 1 OR NULL) AS one , count(question1 = 2 OR NULL) AS two FROM reviews GROUP BY 1;</code>
Pertanyaan tab silang untuk kiraan kompleks:
Fungsi tab silang() memberikan prestasi terbaik dan kesederhanaan apabila berurusan dengan sejumlah besar pilihan:
<code class="language-sql">SELECT * FROM crosstab( 'SELECT category, question1, count(*) AS ct FROM reviews GROUP BY 1, 2 ORDER BY 1, 2' , 'VALUES (0), (1), (2)' ) AS ct (category text, zero int, one int, two int);</code>
Ringkasnya, pilihan FILTER PostgreSQL dan sintaks OR NULL menyediakan kaedah yang cekap dan mudah untuk pengiraan bersyarat, dan fungsi tab silang() berfungsi dengan baik dalam senario pengiraan yang kompleks.
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Kiraan Bersyarat dengan Cekap dalam PostgreSQL Menggunakan Penyata CASE, FILTER atau Crosstab()?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!