PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Всички групи имат ли еднаква обща мощност за дадена подгрупа?

Прочетете внимателно въпроса

И:

Важният момент за производителността е да се изключат рано неподходящите редове и да се изчислят само агрегати за дадената подгрупа . След това (приемайки повече от няколко отделни подгрупи), индекс на (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;

Този е специален. Свързани отговори с обяснение:

Заявка 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 имаше тенденция да бъде малко по-бърза от останалите.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да свържете контейнера за уеб приложения на Docker към контейнера на Docker PostgreSQL?

  2. Sequelize и peer удостоверяване за Postgres?

  3. Отстраняване на грешки в функцията PostgreSQL с помощта на pgAdmin

  4. Как да създам именувани дялове на прозорци (псевдоними) в PostgreSQL?

  5. Съхраняване на PostgreSQL ARRAY от ENUM стойности