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

Nhận tổng riêng biệt của một cột bảng đã nối

Để nhận được kết quả không có truy vấn con , bạn phải dùng đến thủ thuật chức năng cửa sổ nâng cao:

SELECT sum(count(*))       OVER () AS tickets_count
     , sum(min(a.revenue)) OVER () AS atendees_revenue
FROM   tickets   t
JOIN   attendees a ON a.id = t.attendee_id
GROUP  BY t.attendee_id
LIMIT  1;

sqlfiddle

Nó hoạt động như thế nào?

Chìa khóa để hiểu điều này là chuỗi sự kiện trong truy vấn:

chức năng tổng hợp -> chức năng cửa sổ -> DISTINCT -> LIMIT

Thêm chi tiết:

  • Cách tốt nhất để tính kết quả trước khi LIMIT được áp dụng

Từng bước:

  1. I GROUP BY t.attendee_id - điều mà bạn thường làm trong một truy vấn con.

  2. Sau đó, tôi tổng hợp các số đếm để có được tổng số vé. Không hiệu quả lắm, nhưng bị ép buộc bởi yêu cầu của bạn. Hàm tổng hợp count(*) được bao bọc trong hàm cửa sổ sum( ... ) OVER () để đến biểu thức không phổ biến:sum(count(*)) OVER () .

    Và tính tổng doanh thu tối thiểu cho mỗi người tham dự để nhận được tổng không trùng lặp.

    Bạn cũng có thể sử dụng max() hoặc avg() thay vì min() có cùng tác dụng với revenue được đảm bảo là giống nhau cho mọi hàng cho mỗi người tham dự.

    Điều này có thể đơn giản hơn nếu DISTINCT đã được cho phép trong các hàm cửa sổ, nhưng PostgreSQL chưa (chưa) triển khai tính năng này. Theo tài liệu:

    Các hàm cửa sổ tổng hợp, không giống như các hàm tổng hợp bình thường, không cho phép DISTINCT hoặc ORDER BY được sử dụng trong danh sách đối số hàm.

  3. Bước cuối cùng là lấy một hàng duy nhất. Điều này có thể được thực hiện với DISTINCT (Chuẩn SQL) vì tất cả các hàng đều giống nhau. LIMIT 1 sẽ nhanh hơn, mặc dù. Hoặc biểu mẫu chuẩn SQL FETCH FIRST 1 ROWS ONLY .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Django cache.set () gây ra lỗi khóa trùng lặp

  2. Làm thế nào để cài đặt một gói Python trên Linux để nó được tìm thấy bởi phần mở rộng PostgreSQL 13 plpython3u đã hoạt động?

  3. Làm thế nào để chọn nhiều hơn 1 bản ghi mỗi ngày?

  4. cách sửa lỗi OperationalError:(psycopg2.OperationalError) máy chủ đóng kết nối đột ngột

  5. Kết nối Django với postgres bằng docker-soạn