PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Persentase total di PostgreSQL tanpa subquery

Saya kira alasan Anda ingin menghilangkan subquery adalah untuk menghindari pemindaian tabel pengguna dua kali. Ingat totalnya adalah jumlah hitungan untuk setiap negara.

WITH c AS (
  SELECT
    country_id,
    count(*) AS cnt
  FROM users
  WHERE cond1=...
  GROUP BY country_id
) 
SELECT
  *,
  100.0 * cnt / (SELECT sum(cnt) FROM c) AS percent
FROM c;

Kueri ini membuat CTE kecil dengan statistik per negara. Ini hanya akan memindai tabel pengguna satu kali, dan menghasilkan kumpulan hasil kecil (hanya satu baris per negara).

Total (SELECT sum(cnt) FROM c) dihitung hanya sekali pada kumpulan hasil kecil ini, sehingga menggunakan waktu yang dapat diabaikan.

Anda juga dapat menggunakan fungsi jendela :

SELECT
  country_id,
  cnt,
  100.0 * cnt / (sum(cnt) OVER ()) AS percent 
FROM (
  SELECT country_id, count(*) as cnt from users group by country_id
) foo;

(yang sama dengan kueri nightwolf dengan kesalahan yang dihapus lol )

Kedua kueri membutuhkan waktu yang hampir bersamaan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Izin Pengguna PostgreSQL

  2. menyiapkan PostgreSQL dengan proyek Django

  3. Konversikan file dump SQLITE SQL ke POSTGRESQL

  4. Bagaimana cara membuat perintah salin terus berjalan di pergeseran merah bahkan setelah fungsi lambda yang memulainya telah habis?

  5. Bagaimana cara memperbaiki kueri implisit yang lambat pada tabel pg_attribute di Rails