Uważnie przeczytaj pytanie
Oraz:
Ważną kwestią dla skuteczności jest wcześniejsze wykluczenie nieistotnych wierszy i obliczanie tylko agregatów dla danej podgrupy . Następnie (zakładając więcej niż kilka odrębnych podgrup), indeks (subgroup)
może pomóc:
CREATE INDEX ON foo (subgroup);
Każde z poniższych zapytań zwraca FALSE
jeśli co najmniej dwie grupy mają różne sumy sum dla danej podgrupy, a TRUE
w wszystkich inne przypadki (z małym wyjątkiem dla zapytania 5, patrz poniżej).
Zapytanie 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;
Zapytanie 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;
Zapytanie 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;
Zapytanie 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;
Ten jest wyjątkowy. Powiązane odpowiedzi z wyjaśnieniem:
- Zwróć wartość, jeśli nie znaleziono żadnego rekordu
- Jak wypróbować wiele opcji SELECT, aż wynik będzie dostępny?
Zapytanie 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;
Ostatni może się nie powieść, jeśli NULL
wartości mocy są dozwolone. (Ale i tak musiałbyś zdefiniować oczekiwane wyniki w tym przypadku.)
Przeprowadziłem obszerny test i znalazłem wszystkie zapytania do wykonania mniej więcej w idealnych warunkach:
db<>fiddle tutaj
Zapytanie 5 było nieco szybsze niż pozostałe.