gpt4 book ai didi

sql - rails/Postgres : “must appear in the GROUP BY clause or be used in an aggregate function”

转载 作者:数据小太阳 更新时间:2023-10-29 07:23:57 27 4
gpt4 key购买 nike

我正在使用这种方法:

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

我在 Heroku 中遇到这个错误:

PG::Error: ERROR:  column "incomes.filled_at" must appear in the GROUP BY clause 
or be used in an aggregate function

我该如何解决这个问题?谢谢。

执行的查询:

SELECT SUM("incomes"."lines_price") AS sum_lines_price, date(filled_at)
AS date_filled_at FROM "incomes"
HAVING (date(filled_at) > '2012-12-04')
GROUP BY date(filled_at) ORDER BY filled_at ASC

预期结果

[["2012-12-04", SUM_FOR_DATE], ["2012-12-05", SUM_FOR_DATE], ...]

最佳答案

您的错误是可能在默认范围内按顺序使用 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')

但我认为最好是使用 where 而不是 have

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 上创建索引)。

关于sql - rails/Postgres : “must appear in the GROUP BY clause or be used in an aggregate function” ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13933087/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com