Læs spørgsmålet omhyggeligt
Og:
Det vigtige punkt for ydeevne er at ekskludere irrelevante rækker tidligt og kun beregne aggregater for den givne undergruppe . Derefter (forudsat mere end et par forskellige undergrupper), et indeks på (subgroup)
kan hjælpe:
CREATE INDEX ON foo (subgroup);
Hver af de følgende forespørgsler returnerer FALSE
hvis mindst to grupper har forskellige samlede summer for den givne undergruppe, og TRUE
i alle andre tilfælde (med en mindre undtagelse for forespørgsel 5, se nedenfor).
Forespørgsel 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;
Forespørgsel 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;
Forespørgsel 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;
Forespørgsel 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;
Denne er speciel. Relaterede svar med forklaring:
- Return en værdi, hvis der ikke findes nogen post
- Måde at prøve flere SELECT'er, indtil et resultat er tilgængeligt?
Forespørgsel 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;
Den sidste kan mislykkes hvis NULL
værdier i magt er tilladt. (Men du skal alligevel definere forventede resultater i dette tilfælde.)
Jeg kørte en omfattende test og fandt alle forespørgsler til at udføre omtrent det samme under ideelle forhold:
db<>fiddle her
Forespørgsel 5 havde en tendens til at være en smule hurtigere end resten.