我有要求:
Model.group(:p_id).pluck("AVG(desired)")
=> [0.77666666666666667e1, 0.431666666666666667e2, ...]
但是当我运行 SQL 时
SELECT AVG(desired) AS desired
FROM model
GROUP BY p_id
我得到了
-----------------
| desired |
|-----------------|
| 7.76666666666667|
|43.1666666666667 |
| ... |
-----------------
这是什么原因呢?当然我可以乘法,但我敢打赌哪里应该有解释。
我发现
Model.group(:p_id).pluck("AVG(desired)").map{|a| a.to_f}
=> [7.76666666666667,43.1666666666667, ...]
现在我正在努力完成其他任务,我需要 pluck 中的数字属性,所以我的要求是:
Model.group(:p_id).pluck("p_id, AVG(desired)")
在这种情况下如何获得正确的 AVG 值?
最佳答案
0.77666666666666667e1
是(几乎)7.76666666666667
,它们在两种不同的表示形式中是相同的数字,精度略有不同。如果将第一个转储到 irb
,您将看到:
> 0.77666666666666667e1
=> 7.766666666666667
当您在数据库中执行 avg
时,结果的类型为 numeric
,ActiveRecord 使用 Ruby 的 BigDecimal
表示该类型。 BigDecimal
值以科学记数法显示,但在设置数据格式以供显示时,这不会有任何区别。
在任何情况下,pluck
都不是这项工作的正确工具,您需要使用 average
:
Model.group(:p_id).average(:desired)
这将为您提供一个将 p_id
映射到平均值的哈希。您仍会得到 BigDecimal
中的平均值,但这应该不是问题。
关于ruby-on-rails - ActiveRecord AVG 计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47588382/