PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Phần trăm trên tổng số trong PostgreSQL không có truy vấn con

Tôi đoán lý do bạn muốn loại bỏ truy vấn con là để tránh quét bảng người dùng hai lần. Hãy nhớ tổng số là tổng số lượng cho mỗi quốc gia.

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;

Truy vấn này xây dựng một CTE nhỏ với thống kê theo từng quốc gia. Nó sẽ chỉ quét bảng người dùng một lần và tạo ra một tập hợp kết quả nhỏ (chỉ một hàng cho mỗi quốc gia).

Tổng (SELECT sum (cnt) FROM c) chỉ được tính một lần trên tập kết quả nhỏ này, vì vậy nó sử dụng thời gian không đáng kể.

Bạn cũng có thể sử dụng một hàm cửa sổ:

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;

(giống như truy vấn của nightwolf với các lỗi đã được loại bỏ lol)

Cả hai truy vấn mất khoảng thời gian như nhau.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thêm chỉ mục để tăng tốc Bộ mã hóa địa lý gần tìm kiếm

  2. Cách truyền varchar thành boolean

  3. .NET Core ghi nhật ký vào PostgreSQL DB bằng NLog

  4. Làm cách nào để tôi có thể thực hiện ít hơn, lớn hơn trong các trường JSON Postgres?

  5. Sắp xếp theo thứ tự không hoạt động trên các cột được tính toán nếu đặt hàng theo áp dụng trên nhiều cột