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

Jak w Redshift/Postgres zliczyć wiersze spełniające warunek?

Po pierwsze, problem, który masz tutaj, polega na tym, że mówisz „Jeśli ocena jest mniejsza niż 70, wartością tego wyrażenia przypadku jest count(rank). W przeciwnym razie wartością tego wyrażenia jest count(rank) ”. Tak więc w obu przypadkach zawsze otrzymujesz tę samą wartość.

SELECT 
    CASE
        WHEN grade < 70 THEN COUNT(rank)
        ELSE COUNT(rank)
    END
FROM
   grades

count() zlicza tylko wartości inne niż null, więc zazwyczaj wzorzec, który zobaczysz, aby osiągnąć to, czego próbujesz, jest następujący:

SELECT 
    count(CASE WHEN grade < 70 THEN 1 END) as grade_less_than_70,
    count(CASE WHEN grade >= 70 and grade < 80 THEN 1 END) as grade_between_70_and_80
FROM
   grades

W ten sposób wyrażenie case zostanie ocenione jako 1 tylko wtedy, gdy wyrażenie testowe będzie prawdziwe, aw przeciwnym razie będzie miało wartość null. Wtedy count() zliczy tylko instancje inne niż null, tj. gdy wyrażenie testowe jest prawdziwe, co powinno dać ci to, czego potrzebujesz.

Edycja:na marginesie, zauważ, że jest to dokładnie to samo, co pierwotnie napisałeś przy użyciu count(if(test, true-value, false-value)) , tylko przepisany jako count(case when test then true-value end) (a null oznacza wartość false-value, ponieważ else nie został dostarczony do sprawy).

Edycja:postgres 9.4 został wydany kilka miesięcy po tej oryginalnej wymianie. W tej wersji wprowadzono filtry agregujące, które mogą sprawić, że takie scenariusze będą wyglądać trochę ładniej i jaśniej. Ta odpowiedź wciąż otrzymuje sporadyczne głosy za, więc jeśli natknąłeś się tutaj i używasz nowszego postgresa (tj. 9.4+), możesz rozważyć tę równoważną wersję:

SELECT
    count(*) filter (where grade < 70) as grade_less_than_70,
    count(*) filter (where grade >= 70 and grade < 80) as grade_between_70_and_80
FROM
   grades


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Rails:Instalacja PG gem na OS X - nie udało się zbudować natywnego rozszerzenia

  2. gem install pg nie działa na OSX Lion

  3. Jak znaleźć rozmiar dysku tabeli Postgres / PostgreSQL i jej indeksy?

  4. Rejestrowanie audytów dla PostgreSQL

  5. Nie można odszyfrować za pomocą pgcrypto z AES-256-CBC, ale AES-128-CBC jest OK