sql >> データベース >  >> RDS >> PostgreSQL

Rails / Postgres:「GROUPBY句に含めるか、集計関数で使用する必要があります」

    あなたの間違いは、おそらくデフォルトのスコープで、filled_atを順番に使用することでした。

    スコープなしを使用して修正し、デフォルトのスコープを削除できます:

    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

    2012-12-04は2012-12-0400:00:00になるため、TIMESTAMPの使用には注意する必要があります。したがって、この日を結果として使用したくない場合は、Date.today-(n-1)>

    filled_at列にインデックスを作成する場合

     create index incomes_filled_at on incomes(filled_at);
    

    移行:

     add_index :incomes, :filled_at
    

    このテーブルには大量のデータがあり、インデックスはフィルタリングに使用されます。したがって、クエリははるかに高速になるはずです。

    したがって、両方を記述して、どちらが高速かをテストしてください(インデックスがない場合は、filled_atにインデックスを作成する必要があります)。



    1. MySQLで重複する値を見つける

    2. トリガー関数で行タイプの動的列名にアクセスします

    3. SQLクエリを1つの条件から複数の条件に変更する

    4. MYSQLINキーワードがNULL値を考慮しない理由