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

Rails / Postgres:"harus muncul di klausa GROUP BY atau digunakan dalam fungsi agregat"

Kesalahan Anda adalah menggunakan fill_at secara berurutan mungkin dalam lingkup default.

Anda dapat memperbaikinya menggunakan unscoped untuk menghilangkan cakupan default:

Income.unscoped
 .group('date(filled_at)')
 .having("date(filled_at) > ?", Date.today - n)
 .sum(:lines_price)

atau

Income.unscoped
   .group('date(filled_at)')
   .having("date(filled_at) > ?", Date.today - n)
   .sum(:lines_price)
   .order('date(filled_at) ASC')

tapi saya pikir lebih baik menggunakan where daripada memiliki

Income.unscoped
  .where("date(filled_at) > TIMESTAMP ?", Date.today - n)
  .group('date(filled_at)')
  .sum(:lines_price)
  .order('date(filled_at) ASC')

SQLFiddle

Anda harus berhati-hati dalam menggunakan TIMESTAMP karena 2012-12-04 akan menjadi 12-12-04 00:00:00 jadi jika Anda tidak ingin hari ini dalam hasil gunakan Date.today - (n - 1)

Jika Anda membuat indeks pada kolom fill_at

 create index incomes_filled_at on incomes(filled_at);

migrasi:

 add_index :incomes, :filled_at

dan Anda memiliki banyak data dalam indeks tabel ini akan digunakan dalam penyaringan. Jadi kueri harus jauh lebih cepat.

Jadi tulis saja keduanya dan uji mana yang lebih cepat (Anda harus membuat indeks di fill_at jika Anda tidak memilikinya).



  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 kita bisa membuat "statement_timeout" berfungsi di dalam suatu fungsi?

  2. Kapan Postgres memeriksa batasan unik?

  3. Bagaimana cara saya mendapatkan dukungan LISTEN/NOTIFY asynchronous/even-driven di Java menggunakan database Postgres?

  4. Bergabunglah dengan kueri hitungan di generate_series() dan ambil nilai Null sebagai '0'

  5. Pernyataan yang Disiapkan Sudah Ada