sql >> Databáze >  >> RDS >> PostgreSQL

Rails / Postgres:„musí se objevit v klauzuli GROUP BY nebo být použit v agregační funkci“

Vaší chybou bylo použít fill_at v pořadí pravděpodobně ve výchozím rozsahu.

Můžete to opravit pomocí unscoped, abyste odstranili výchozí rozsahy:

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

nebo

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

ale myslím, že lepší bude použít kde místo mít

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

SQLFiddle

Při používání TIMESTAMP musíte být opatrní, protože 2012-12-04 se stane 2012-12-04 00:00:00, takže pokud nechcete, aby tento den byl ve výsledku, použijte Date.today - (n - 1)

Pokud vytvoříte index ve sloupci fill_at

 create index incomes_filled_at on incomes(filled_at);

migrace:

 add_index :incomes, :filled_at

a máte mnoho dat v této tabulce index bude použit při filtrování. Dotaz by tedy měl být mnohem rychlejší.

Stačí tedy napsat obojí a otestovat, co je rychlejší (pokud žádný nemáte, musíte si vytvořit index na fill_at).



  1. Integrace Sphinx do MySQL

  2. Rozdíl mezi tabulkou DELETE a TRUNCATE na serveru SQL Server

  3. Alternativa pro django.db.close_connection()

  4. Importujte soubor .sql v aplikaci Access