sql >> Database >  >> RDS >> PostgreSQL

Rails / Postgres:"moet voorkomen in de GROUP BY-clausule of worden gebruikt in een aggregatiefunctie"

Uw fout was om filled_at in volgorde te gebruiken, waarschijnlijk in het standaard bereik.

U kunt het oplossen door gebruik te maken van unscoped om standaardscopes te elimineren:

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

of

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

maar ik denk dat het beter is om waar te gebruiken in plaats van

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

SQLFiddle

Je moet voorzichtig zijn met het gebruik van TIMESTAMP omdat 04-12-2012 wordt 2012-12-04 00:00:00 dus als je deze dag niet als resultaat wilt gebruiken, gebruik dan Date.today - (n - 1)

Als u een index maakt in de kolom filled_at

 create index incomes_filled_at on incomes(filled_at);

migratie:

 add_index :incomes, :filled_at

en je hebt veel gegevens in deze tabelindex die zal worden gebruikt bij het filteren. Het opvragen zou dus veel sneller moeten zijn.

Dus schrijf gewoon beide en test wat sneller is (je moet een index maken op filled_at als je er geen hebt).



  1. Maak een database-e-mailprofiel in SQL Server (T-SQL)

  2. Wat is een één-op-veel-relatie in een database? Een uitleg met voorbeelden

  3. SQL-query structureren op basis van meerdere selectievakjes-status

  4. Een database ontwerpen met periodieke sensorgegevens