Přečtěte si pozorně otázku
A:
Důležitým bodem pro výkon je včasné vyloučení irelevantních řádků a pouze agregace pro danou podskupinu . Poté (za předpokladu více než několika různých podskupin) index na (subgroup)
může pomoci:
CREATE INDEX ON foo (subgroup);
Každý z následujících dotazů vrací FALSE
pokud alespoň dvě skupiny mají různé celkové součty pro danou podskupinu, a TRUE
ve všech ostatní případy (s malou výjimkou pro dotaz 5, viz níže).
Dotaz 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;
Dotaz 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;
Dotaz 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;
Dotaz 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;
Tenhle je speciální. Související odpovědi s vysvětlením:
- Vraťte hodnotu, pokud není nalezen žádný záznam
- Jak vyzkoušet více SELECT, dokud nebude k dispozici výsledek?
Dotaz 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;
Poslední může selhat, pokud NULL
hodnoty výkonu jsou povoleny. (V tomto případě byste ale stejně museli definovat očekávané výsledky.)
Provedl jsem rozsáhlý test a zjistil, že všechny dotazy fungují za ideálních podmínek přibližně stejně:
db<>fiddle zde
Dotaz 5 měl tendenci být o něco rychlejší než ostatní.