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

Rails / Postgres:"skal vises i GROUP BY-klausulen eller bruges i en aggregeret funktion"

Din fejl var at bruge filled_at i rækkefølge, sandsynligvis i standardomfang.

Du kan rette det ved at bruge unscoped for at eliminere standardomfang:

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

eller

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

men jeg tror, ​​det vil være bedre at bruge hvor i stedet for at have

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

SQLFiddle

Du skal være forsigtig med at bruge TIMESTAMP, fordi 2012-12-04 bliver 2012-12-04 00:00:00, så hvis du ikke vil have denne dag i resultat, brug Date.today - (n - 1)

Hvis du opretter indeks på filled_at kolonne

 create index incomes_filled_at on incomes(filled_at);

migration:

 add_index :incomes, :filled_at

og du har en masse data i denne tabel indeks vil blive brugt i filtrering. Så forespørgslen burde være meget hurtigere.

Så skriv bare begge dele og test, hvad der er hurtigere (du skal oprette indeks på filled_at, hvis du ikke har et).



  1. Sådan sammenlignes kun dato og år i php codeigniter

  2. Ret DB-duplikerede poster (MySQL-fejl)

  3. Er NOLOCK standard for SELECT-sætninger i SQL Server 2005?

  4. JPA TemporalType.Dato giver forkert dato