ActiveRecord AVG计算

时间:2017-12-01 07:16:12

标签: ruby-on-rails postgresql activerecord rails-activerecord average

我有要求:

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, ...] 

现在我正在努力完成其他任务,我需要采取数字属性,所以我的要求是:

Model.group(:p_id).pluck("p_id, AVG(desired)") 

在这种情况下如何获得正确的AVG值?

2 个答案:

答案 0 :(得分:2)

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中的平均值,但这确实不是问题。

答案 1 :(得分:0)

最后我找到了解决方案:

Model.group(:p_id).pluck("p_id, AVG(Round(desired))")
=> [[1,7.76666666666667],[2,43.1666666666667], ...]