Leggi attentamente la domanda
E:
Il punto importante per le prestazioni è escludere in anticipo le righe irrilevanti e calcolare solo gli aggregati per il sottogruppo specificato . Quindi (assumendo più di alcuni sottogruppi distinti), un indice su (subgroup)
può aiutare:
CREATE INDEX ON foo (subgroup);
Ciascuna delle seguenti query restituisce FALSE
se almeno due gruppi hanno somme totali diverse per il sottogruppo specificato, e TRUE
in tutti altri casi (con una piccola eccezione per la query 5, vedi sotto).
Richiesta 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;
Interrogazione 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;
Interrogazione 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;
Interrogazione 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;
Questo è speciale. Risposte correlate con spiegazione:
- Restituisci un valore se non viene trovato alcun record
- Come provare più SELECT finché non è disponibile un risultato?
Interrogazione 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;
L'ultimo può fallire se NULL
sono ammessi valori al potere. (Ma in questo caso dovresti comunque definire i risultati attesi.)
Ho eseguito un test approfondito e ha riscontrato che tutte le query funzionano allo stesso modo in condizioni ideali:
db<>violino qui
La query 5 tendeva ad essere un po' più veloce delle altre.