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

Có phải tất cả các nhóm đều có tổng lũy ​​thừa bằng nhau cho nhóm con đã cho không?

Đọc kỹ câu hỏi

Và:

Điểm quan trọng đối với hiệu suất là sớm loại trừ các hàng không liên quan và chỉ tính tổng hợp cho nhóm con nhất định . Sau đó (giả sử có nhiều hơn một vài nhóm con riêng biệt), một chỉ mục trên (subgroup) có thể giúp:

CREATE INDEX ON foo (subgroup);

Mỗi truy vấn sau đây trả về FALSE nếu ít nhất hai nhóm có tổng số tiền khác nhau cho nhóm con đã cho và TRUE trong tất cả các trường hợp khác (với một ngoại lệ nhỏ cho truy vấn 5, xem bên dưới).

Truy vấn 1

SELECT count(DISTINCT total_power) = 1
FROM  (
   SELECT sum(power) AS total_power
   FROM   foo
   WHERE  subgroup = 'Sub_B'  -- exclude irrelevant rows early!
   GROUP  BY grp
   ) sub;

Truy vấn 2

SELECT count(*) = 1
FROM  (
   SELECT true
   FROM  (
      SELECT sum(power) AS total_power
      FROM   foo
      WHERE  subgroup = 'Sub_C'
      GROUP  BY grp
      ) sub2
   GROUP  BY total_power
   ) sub2;

Truy vấn 3

SELECT count(*) OVER () = 1
FROM  (
   SELECT sum(power) AS total_power
   FROM   foo
   WHERE  subgroup = 'Sub_A'
   GROUP  BY grp
   ) sub
GROUP  BY total_power
LIMIT  1;

Truy vấn 4

(
SELECT FALSE
FROM  (
   SELECT sum(power) AS total_power
   FROM   foo
   WHERE  subgroup = 'Sub_A'
   GROUP  BY grp
   ) sub
GROUP  BY total_power
OFFSET 1
LIMIT  1
)
UNION ALL
SELECT TRUE
LIMIT 1;

Điều này là đặc biệt. Các câu trả lời liên quan kèm theo giải thích:

Truy vấn 5

SELECT min(total_power) = max(total_power)  -- can fail for NULL values
FROM  (
   SELECT sum(power) AS total_power
   FROM   foo
   WHERE  subgroup = 'Sub_A'
   GROUP  BY grp
   ) sub;

Cuối cùng có thể không thành công nếu NULL các giá trị trong quyền lực được cho phép. (Nhưng dù sao thì bạn cũng phải xác định kết quả mong đợi trong trường hợp này.)

Tôi đã chạy một thử nghiệm mở rộng và tìm thấy tất cả các truy vấn để thực hiện giống nhau trong điều kiện lý tưởng:

db <> fiddle tại đây

Truy vấn 5 có xu hướng nhanh hơn một chút so với phần còn 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. PostgreSQL:Sửa đổi CHỦ SỞ HỮU trên tất cả các bảng đồng thời trong PostgreSQL

  2. Sqlalchemy với postgres. Cố gắng lấy "DISTINCT ON" thay vì "DISTINCT"

  3. Thời gian TTFB mạng cao trên máy chủ cục bộ và từ xa

  4. Lỗi PostgreSQL khi cố gắng tạo tiện ích mở rộng

  5. Làm cách nào để tạo người dùng cho một db trong postgresql?