PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Tutti i gruppi hanno la stessa potenza totale per un dato sottogruppo?

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:

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.