Đọ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.