PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Rails / Postgres:“deve comparire nella clausola GROUP BY o essere utilizzato in una funzione aggregata”

Il tuo errore è stato usare riempito_at in ordine probabilmente nell'ambito predefinito.

Puoi risolverlo utilizzando senza ambito per eliminare gli ambiti predefiniti:

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

o

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

ma penso che sarà meglio usare dove invece di avere

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

SQLFiddle

Devi stare attento a usare TIMESTAMP perché 2012-12-04 diventerà 2012-12-04 00:00:00 quindi se non vuoi questo giorno come risultato usa Date.today - (n - 1)

Se crei un indice nella colonna filled_at

 create index incomes_filled_at on incomes(filled_at);

migrazione:

 add_index :incomes, :filled_at

e hai molti dati in questa tabella, l'indice verrà utilizzato nel filtraggio. Quindi la query dovrebbe essere molto più veloce.

Quindi scrivi entrambi e verifica che è più veloce (devi creare un indice su filled_at se non ne hai uno).