sql >> Base de Datos >  >> RDS >> PostgreSQL

Rails/Postgres:“debe aparecer en la cláusula GROUP BY o usarse en una función agregada”

Su error fue usar filled_at en orden probablemente en el ámbito predeterminado.

Puede solucionarlo usando unscoped para eliminar los ámbitos predeterminados:

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')

pero creo que mejor sera usar where en lugar de tener

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

SQLFiddle

Debe tener cuidado al usar TIMESTAMP porque 2012-12-04 se convertirá en 2012-12-04 00:00:00, por lo que si no desea este día como resultado, use Date.today - (n - 1)

Si crea un índice en la columnafilled_at

 create index incomes_filled_at on incomes(filled_at);

migración:

 add_index :incomes, :filled_at

y tiene una gran cantidad de datos en el índice de esta tabla se utilizará en el filtrado. Entonces la consulta debería ser mucho más rápida.

Así que escribe ambos y prueba cuál es más rápido (tienes que crear un índice enfilled_at si no tienes uno).