質問を注意深く読んでください
そして:
パフォーマンスの重要なポイントは、無関係な行を早期に除外し、指定されたサブグループの集計のみを計算することです。 。次に(いくつかの異なるサブグループを想定)、(subgroup)
のインデックス 助けることができます:
CREATE INDEX ON foo (subgroup);
次の各クエリはFALSE
を返します 少なくとも2つのグループが、指定されたサブグループの合計が異なる場合、およびTRUE
すべて その他の場合(クエリ5のマイナーな例外を除いて、以下を参照)。
クエリ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;
クエリ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;
クエリ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;
クエリ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;
これは特別です。説明付きの関連回答:
クエリ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;
NULL
の場合、最後は失敗する可能性があります 電力の値が許可されます。 (ただし、この場合、とにかく期待される結果を定義する必要があります。)
広範なテストを実行しました そして、すべてのクエリが理想的な条件下でほぼ同じように実行されることを発見しました:
db <> fiddle こちら
クエリ5は、他のクエリよりも少し速い傾向がありました。