PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Agregat kolom dengan filter tambahan (berbeda)

agregat FILTER klausa di Postgres 9.4 atau yang lebih baru lebih pendek dan lebih cepat:

SELECT u.name
     , count(*) FILTER (WHERE g.winner_id  > 0)    AS played
     , count(*) FILTER (WHERE g.winner_id  = u.id) AS won
     , count(*) FILTER (WHERE g.winner_id <> u.id) AS lost
FROM   games g
JOIN   users u ON u.id IN (g.player_1_id, g.player_2_id)
GROUP  BY u.name;
  • Panduan
  • Wiki Pascagres
  • Pos blog Depesz

Di Postgres 9.3 (atau apa saja versi) ini masih lebih pendek dan lebih cepat daripada sub-pilihan bersarang atau CASE ekspresi:

SELECT u.name
     , count(g.winner_id  > 0 OR NULL)    AS played
     , count(g.winner_id  = u.id OR NULL) AS won
     , count(g.winner_id <> u.id OR NULL) AS lost
FROM   games g
JOIN   users u ON u.id IN (g.player_1_id, g.player_2_id)
GROUP  BY u.name;

Detail:

  • Untuk performa absolut, apakah SUM lebih cepat atau COUNT?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jika hitungan PostgreSQL (*) selalu lambat, bagaimana cara membuat halaman kueri kompleks?

  2. Audit Logging untuk PostgreSQL

  3. Menghitung jumlah kemunculan substring dalam string di PostgreSQL

  4. Bagaimana cara memasukkan hasil nol / 0 dalam COUNT agregat?

  5. Target waktu pemulihan pgbackrest