PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Rails / Postgres:„трябва да се появи в клаузата GROUP BY или да се използва в агрегатна функция“

Грешката ви беше да използвате filled_at в реда на вероятно в обхвата по подразбиране.

Можете да го коригирате, като използвате unscoped, за да премахнете обхватите по подразбиране:

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

или

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

но мисля, че ще бъде по-добре да се използва където вместо да има

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

SQLFiddle

Трябва да внимавате с използването на TIMESTAMP, защото 2012-12-04 ще стане 2012-12-04 00:00:00, така че ако не искате този ден в резултат, използвайте Date.today - (n - 1)

Ако създадете индекс на filled_at колона

 create index incomes_filled_at on incomes(filled_at);

миграция:

 add_index :incomes, :filled_at

и имате много данни в тази таблица, индексът ще бъде използван при филтриране. Така че заявката трябва да бъде много по-бърза.

Така че просто напишете и двете и тествайте кое е по-бързо (трябва да създадете индекс на filled_at, ако нямате такъв).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Цел за време за възстановяване на Pgbackrest

  2. Ред на сортиране на низове (LC_COLLATE и LC_CTYPE)

  3. PostgreSQL еквивалент на подсказката NoLock на SQLServer

  4. rails postgres ГРЕШКА:невалиден входен синтаксис за тип двойна точност

  5. Изравняване на вложена JSONB колона на Postgres