PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Rails / Postgres:„muss in der GROUP BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden“

Ihr Fehler war, filled_at in der Reihenfolge wahrscheinlich im Standardbereich zu verwenden.

Sie können dies beheben, indem Sie unscoped verwenden, um Standardbereiche zu eliminieren:

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

oder

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

aber ich denke, dass es besser ist, where statt have

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

SQLFiddle

Sie müssen bei der Verwendung von TIMESTAMP vorsichtig sein, da 2012-12-04 zu 2012-12-04 00:00:00 wird. Wenn Sie diesen Tag also nicht als Ergebnis haben möchten, verwenden Sie Date.today - (n - 1)

Wenn Sie einen Index für die Spalte „filled_at“ erstellen

 create index incomes_filled_at on incomes(filled_at);

Migration:

 add_index :incomes, :filled_at

und Sie haben viele Daten in diesem Tabellenindex, der beim Filtern verwendet wird. Die Abfrage sollte also viel schneller sein.

Schreiben Sie also einfach beides und testen Sie, was schneller ist (Sie müssen einen Index auf filled_at erstellen, wenn Sie keinen haben).