Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Melaksanakan Kiraan Bersyarat dengan Cekap dalam PostgreSQL Menggunakan Penyata CASE, FILTER atau Crosstab()?

Bagaimana untuk Melaksanakan Kiraan Bersyarat dengan Cekap dalam PostgreSQL Menggunakan Penyata CASE, FILTER atau Crosstab()?

DDD
Lepaskan: 2025-01-24 06:16:13
asal
161 orang telah melayarinya

How to Efficiently Perform Conditional Counts in PostgreSQL Using CASE Statements, FILTER, or Crosstab()?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

Batasan penyata KES:

Walaupun kaedah ini boleh melaksanakan pengiraan bersyarat, kaedah ini mempunyai kelemahan:

  • Kod panjang: Menulis berbilang penyata CASE adalah terdedah kepada ralat dan tidak cekap.
  • Isu prestasi: Menggunakan ungkapan CASE dan ELSE 0 boleh menjejaskan prestasi.

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan