sql >> Databasteknik >  >> RDS >> PostgreSQL

Har alla grupper lika stor effekt för en given undergrupp?

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:

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.



  1. Hur man bevarar databasanslutning i en python-webbserver

  2. Fulltextsökning på delsträng i PostgreSQL

  3. Hur man väljer ett kolumnnamn med ett mellanslag i MySQL

  4. Summan av timmar och minuter i SQL Server 2008