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

Rails / Postgres:„musi pojawić się w klauzuli GROUP BY lub być użyty w funkcji agregującej”

Twoim błędem było użycie fill_at w kolejności prawdopodobnie w domyślnym zakresie.

Możesz to naprawić, używając unscoped, aby wyeliminować domyślne zakresy:

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

lub

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

ale myślę, że lepiej będzie używać gdzie zamiast mieć

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

SQLFiddle

Musisz uważać na używanie TIMESTAMP, ponieważ 2012-12-04 stanie się 2012-12-04 00:00:00, więc jeśli nie chcesz, aby ten dzień był wynikiem, użyj Date.today - (n - 1)

Jeśli utworzysz indeks na kolumnie fill_at

 create index incomes_filled_at on incomes(filled_at);

migracja:

 add_index :incomes, :filled_at

i masz dużo danych w tym indeksie tabeli, które zostaną użyte do filtrowania. Więc zapytanie powinno być znacznie szybsze.

Więc po prostu napisz oba i przetestuj, co jest szybsze (musisz utworzyć indeks na fill_at, jeśli go nie masz).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zrobić pole ARRAY z ograniczeniem klucza obcego w SQLAlchemy?

  2. Docker Compose + Spring Boot + połączenie Postgres

  3. Tabele tymczasowe PostgreSQL

  4. Jak sprawdzić, która funkcja używa typu?

  5. Heroku Postgres Error:PGError:ERROR:organizacje relacyjne nie istnieją (ActiveRecord::StatementInvalid)