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:
- Devolver un valor si no se encuentra ningún registro
- ¿Forma de probar múltiples SELECT hasta que haya un resultado disponible?
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.