sql >> Databasteknik >  >> RDS >> PostgreSQL

Rails / Postgres:"måste visas i GROUP BY-satsen eller användas i en aggregerad funktion"

Ditt misstag var att använda filled_at i ordning, förmodligen i standardomfattning.

Du kan fixa det genom att använda unscoped för att eliminera standardscopes:

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 jag tror att det är bättre att använda var istället för att ha

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

SQLFiddle

Du måste vara försiktig med att använda TIMESTAMP eftersom 2012-12-04 kommer att bli 2012-12-04 00:00:00 så om du inte vill ha den här dagen i resultat använd Date.today - (n - 1)

Om du skapar index på filled_at-kolumnen

 create index incomes_filled_at on incomes(filled_at);

migrering:

 add_index :incomes, :filled_at

och du har mycket data i detta tabellindex kommer att användas i filtrering. Så frågan borde vara mycket snabbare.

Så skriv bara båda och testa vilket som är snabbare (du måste skapa index på filled_at om du inte har något).



  1. Var klausul för att filtrera rader i MySQL

  2. jquery php infoga data i mysql utan att uppdatera sidan

  3. Hur man löser det saknade uttrycket i ORA-00936

  4. Hur lagrar man decimal i MySQL?