PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Czy wszystkie grupy mają równą całkowitą moc dla danej podgrupy?

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:

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaka jest różnica między LATERAL JOIN a podzapytanie w PostgreSQL?

  2. Wykorzystanie szyfrowania do wzmocnienia bezpieczeństwa bazy danych PostgreSQL

  3. Złożone zapytanie SQL z wieloma tabelami i relacjami

  4. Jak uciec przed znakiem zapytania (?) za pomocą Spring JpaRepository?

  5. SQLAlchemy:Sprawdź, czy dana wartość znajduje się na liście