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

Điều kiện đếm ở đâu PostgreSQL

SELECT a.license_id, a.limit_call
     , count(b.license_id) AS overall_count
FROM   "License"  a
LEFT   JOIN "Log" b USING (license_id)
WHERE  a.license_id = 7 
GROUP  BY a.license_id  -- , a.limit_call  -- add in old versions
HAVING a.limit_call > count(b.license_id)

Vì Postgres 9.1, khóa chính bao gồm tất cả các cột của bảng trong GROUP BY mệnh đề. Trong các phiên bản cũ hơn, bạn phải thêm a.limit_call vào GROUP BY danh sách. Các ghi chú phát hành cho 9.1:

Cho phép không phải GROUP BY trong danh sách đích truy vấn khi khóa chính được chỉ định trong GROUP BY mệnh đề

Đọc thêm:

  • Tại sao tôi không thể loại trừ các cột phụ thuộc khỏi `GROUP BY` khi tôi tổng hợp theo một khóa?

Điều kiện bạn có trong WHERE mệnh đề phải chuyển đến HAVING mệnh đề vì nó đề cập đến kết quả của một hàm tổng hợp ( sau WHERE đã được áp dụng). Và bạn không thể tham chiếu đến cột đầu ra (bí danh cột) trong HAVING mệnh đề, nơi bạn chỉ có thể tham chiếu các cột đầu vào. Vì vậy, bạn phải lặp lại biểu thức. Hướng dẫn sử dụng:

Tên của cột đầu ra có thể được sử dụng để tham chiếu đến giá trị của cột trong ORDER BYGROUP BY các mệnh đề, nhưng không có trong WHERE hoặc HAVING điều khoản; ở đó bạn phải viết ra biểu thức để thay thế.

Tôi đã đảo ngược thứ tự của các bảng trong FROM và làm sạch cú pháp một chút để làm cho nó bớt khó hiểu hơn. USING chỉ là một sự tiện lợi về mặt lưu ý ở đây.

Tôi đã sử dụng LEFT JOIN thay vì JOIN , vì vậy bạn không loại trừ giấy phép mà không có bất kỳ nhật ký nào.

Chỉ các giá trị không rỗng mới được tính bằng count() . Vì bạn muốn đếm mục nhập có liên quan trong bảng "Log" an toàn hơn và rẻ hơn một chút khi sử dụng count(b.license_id) . Cột này được sử dụng trong phép nối, vì vậy chúng ta không phải bận tâm xem cột có thể rỗng hay không.
count(*) thậm chí còn ngắn hơn và nhanh hơn một chút. Nếu bạn không phiền hãy đếm 1 cho 0 các hàng trong bảng bên trái, hãy sử dụng.

Bên cạnh:Tôi sẽ khuyên không để sử dụng số nhận dạng chữ hoa chữ thường hỗn hợp trong Postgres nếu có thể. Rất dễ xảy ra lỗi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tôi muốn tìm nạp dữ liệu từ các tên bảng khác nhau bằng cách sử dụng hàm postgresql

  2. Tại sao tốt nhất nên lưu trữ số điện thoại dưới dạng chuỗi so với số nguyên?

  3. Rails Migrations:đã cố gắng thay đổi loại cột từ chuỗi thành số nguyên

  4. Postgres:chuyển đổi một hàng thành nhiều hàng (bỏ chia)

  5. Làm cách nào để sao chép từ tệp CSV sang bảng PostgreSQL với tiêu đề trong tệp CSV?