sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Todos los grupos tienen el mismo poder total para un subgrupo dado?

Lea atentamente la pregunta

Y:

El punto importante para el rendimiento es excluir las filas irrelevantes antes y solo calcular los agregados para el subgrupo dado. . Luego (asumiendo más de unos pocos subgrupos distintos), un índice en (subgroup) puede ayudar:

CREATE INDEX ON foo (subgroup);

Cada una de las siguientes consultas devuelve FALSE si al menos dos grupos tienen sumas totales diferentes para el subgrupo dado, y TRUE en todos otros casos (con una excepción menor para la consulta 5, ver más abajo).

Consulta 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;

Consulta 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;

Consulta 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;

Consulta 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;

Este es especial. Respuestas relacionadas con explicación:

Consulta 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;

El último puede fallar si NULL Se permiten valores en potencia. (Pero tendría que definir los resultados esperados en este caso de todos modos).

Realicé una prueba exhaustiva y encontró todas las consultas para realizar casi lo mismo en condiciones ideales:

db<>fiddle aquí

La consulta 5 tendía a ser un poco más rápida que el resto.