Läs frågan noggrant
Och:
Det viktiga för prestanda är att utesluta irrelevanta rader tidigt och enbart beräkna aggregat för den givna undergruppen . Sedan (förutsatt att fler än ett fåtal distinkta undergrupper), ett index på (subgroup)
kan hjälpa:
CREATE INDEX ON foo (subgroup);
Var och en av följande frågor returnerar FALSE
om minst två grupper har olika totalsummor för den givna undergruppen, och TRUE
i alla andra fall (med ett mindre undantag för fråga 5, se nedan).
Fråga 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;
Fråga 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;
Fråga 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;
Fråga 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;
Den här är speciell. Relaterade svar med förklaring:
- Returnera en värde om ingen post hittas
- Sätt att prova flera SELECT tills ett resultat är tillgängligt?
Fråga 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 sista kan misslyckas om NULL
värden i makt är tillåtna. (Men du måste definiera förväntade resultat i det här fallet ändå.)
Jag körde ett omfattande test och hittade alla frågor som fungerade ungefär likadant under idealiska förhållanden:
db<>fiol här
Fråga 5 tenderade att vara lite snabbare än resten.