PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Rails / Postgres:"phải xuất hiện trong mệnh đề GROUP BY hoặc được sử dụng trong một hàm tổng hợp"

Sai lầm của bạn là sử dụng fill_at theo thứ tự có lẽ trong phạm vi mặc định.

Bạn có thể sửa nó bằng cách sử dụng unscoped để loại bỏ phạm vi mặc định:

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

hoặc

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

nhưng tôi nghĩ rằng tốt hơn sẽ là sử dụng ở đâu thay vì có

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

SQLFiddle

Bạn phải cẩn thận khi sử dụng TIMESTAMP vì 2012-12-04 sẽ trở thành 2012-12-04 00:00:00 nên nếu bạn không muốn kết quả là ngày này, hãy sử dụng Date.today - (n - 1)

Nếu bạn tạo chỉ mục trên cột fill_at

 create index incomes_filled_at on incomes(filled_at);

di chuyển:

 add_index :incomes, :filled_at

và bạn có nhiều dữ liệu trong bảng này chỉ mục sẽ được sử dụng để lọc. Vì vậy, truy vấn sẽ nhanh hơn nhiều.

Vì vậy, chỉ cần viết cả hai và kiểm tra cái nào nhanh hơn (bạn phải tạo chỉ mục trên fill_at nếu chưa có).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. làm cách nào để tạo tệp XML mới từ cơ sở dữ liệu hiện có trong cơ sở dữ liệu PostgreSQL bằng java

  2. Asinh () hoạt động như thế nào trong PostgreSQL

  3. Tại sao null bằng số nguyên trong WHERE?

  4. Loại bỏ các thẻ HTML trong PostgreSQL

  5. Cơ sở dữ liệu bền vững bằng cách sử dụng khối lượng docker