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

Har alle grupper lige stor magt for en given undergruppe?

Læs spørgsmålet omhyggeligt

Og:

Det vigtige punkt for ydeevne er at ekskludere irrelevante rækker tidligt og kun beregne aggregater for den givne undergruppe . Derefter (forudsat mere end et par forskellige undergrupper), et indeks på (subgroup) kan hjælpe:

CREATE INDEX ON foo (subgroup);

Hver af de følgende forespørgsler returnerer FALSE hvis mindst to grupper har forskellige samlede summer for den givne undergruppe, og TRUE i alle andre tilfælde (med en mindre undtagelse for forespørgsel 5, se nedenfor).

Forespørgsel 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;

Forespørgsel 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;

Forespørgsel 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;

Forespørgsel 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;

Denne er speciel. Relaterede svar med forklaring:

Forespørgsel 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 sidste kan mislykkes hvis NULL værdier i magt er tilladt. (Men du skal alligevel definere forventede resultater i dette tilfælde.)

Jeg kørte en omfattende test og fandt alle forespørgsler til at udføre omtrent det samme under ideelle forhold:

db<>fiddle her

Forespørgsel 5 havde en tendens til at være en smule hurtigere end resten.



  1. TAN() Funktion i Oracle

  2. Hvordan ændrer jeg datatypen for en kolonne i MySQL?

  3. Kan jeg bruge COUNT() og DISTINCT sammen?

  4. MacOSX homebrew mysql root adgangskode