sql >> Databáze >  >> RDS >> PostgreSQL

Mají všechny skupiny stejnou celkovou moc pro danou podskupinu?

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:

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í.



  1. sledovat prohlášení orákula

  2. MySQL:Získat průměr časových rozdílů?

  3. Je nutné zapsat ROLLBACK, pokud dotazy selžou?

  4. levé vnější spojení, kde jsou tabulky ze dvou různých databázových systémů