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

PostgreSQL Di mana menghitung kondisi

SELECT a.license_id, a.limit_call
     , count(b.license_id) AS overall_count
FROM   "License"  a
LEFT   JOIN "Log" b USING (license_id)
WHERE  a.license_id = 7 
GROUP  BY a.license_id  -- , a.limit_call  -- add in old versions
HAVING a.limit_call > count(b.license_id)

Sejak Postgres 9.1 kunci utama mencakup semua kolom tabel di GROUP BY ayat. Di versi lama Anda harus menambahkan a.limit_call ke GROUP BY daftar. Catatan rilis untuk 9.1:

Izinkan non-GROUP BY kolom dalam daftar target kueri saat kunci utama ditentukan di GROUP BY klausa

Bacaan lebih lanjut:

  • Mengapa saya tidak dapat mengecualikan kolom dependen dari `GROUP BY` saat saya mengagregasi berdasarkan kunci?

Kondisi yang Anda miliki di WHERE klausa harus pindah ke HAVING klausa karena mengacu pada hasil fungsi agregat (setelah WHERE telah diterapkan). Dan Anda tidak dapat merujuk ke kolom keluaran (alias kolom) di HAVING klausa, di mana Anda hanya dapat mereferensikan kolom input. Jadi, Anda harus mengulang ekspresi. Panduan:

Nama kolom keluaran dapat digunakan untuk merujuk ke nilai kolom diORDER BY dan GROUP BY klausa, tetapi tidak dalam WHERE atau HAVING klausa; di sana Anda harus menuliskan ekspresinya.

Saya membalik urutan tabel di FROM klausa dan membersihkan sintaks sedikit untuk membuatnya kurang membingungkan. USING hanya kenyamanan notasi di sini.

Saya menggunakan LEFT JOIN alih-alih JOIN , jadi Anda tidak mengecualikan lisensi tanpa log sama sekali.

Hanya nilai bukan nol yang dihitung oleh count() . Karena Anda ingin menghitung entri terkait dalam tabel "Log" lebih aman dan sedikit lebih murah menggunakan count(b.license_id) . Kolom ini digunakan dalam join, jadi kita tidak perlu pusing-pusing apakah kolomnya bisa null atau tidak.
count(*) bahkan lebih pendek dan sedikit lebih cepat. Jika Anda tidak keberatan untuk mendapatkan hitungan 1 untuk 0 baris di tabel kiri, gunakan itu.

Selain:Saya akan menyarankan tidak untuk menggunakan pengidentifikasi huruf besar-kecil di Postgres jika memungkinkan. Sangat rawan kesalahan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana Fungsi Exp() Bekerja di PostgreSQL

  2. Cara Mengotomatiskan Penerapan Database PostgreSQL

  3. Bagaimana cara membaca konten file .sql menjadi skrip R untuk menjalankan kueri?

  4. Indeks PostgreSQL di JSON

  5. Ambil nilai terakhir yang diketahui untuk setiap kolom dari satu baris