Прочетете внимателно въпроса
И:
Важният момент за производителността е да се изключат рано неподходящите редове и да се изчислят само агрегати за дадената подгрупа . След това (приемайки повече от няколко отделни подгрупи), индекс на (subgroup)
може да помогне:
CREATE INDEX ON foo (subgroup);
Всяка от следните заявки връща FALSE
ако поне две групи имат различни общи суми за дадената подгрупа и TRUE
във всички други случаи (с малко изключение за заявка 5, вижте по-долу).
Заявка 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;
Заявка 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;
Заявка 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;
Заявка 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;
Този е специален. Свързани отговори с обяснение:
- Връщане на стойност, ако не е намерен запис
- Начин да изпробвате няколко SELECT, докато резултатът е наличен?
Заявка 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;
Последното може да се провали, ако NULL
разрешени са стойности на мощност. (Но така или иначе ще трябва да дефинирате очакваните резултати в този случай.)
Проведох обширен тест и установи, че всички заявки се изпълняват приблизително еднакво при идеални условия:
db<>fiddle тук
Заявка 5 имаше тенденция да бъде малко по-бърза от останалите.