Ruby on rails ActiveRecord平均值计算

Ruby on rails ActiveRecord平均值计算,ruby-on-rails,postgresql,activerecord,rails-activerecord,average,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.766666666

我要求:

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, ...] 
现在我正在努力完成其他任务,我需要Pull中的数字属性,因此我的请求是:

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

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

最后我找到了解决方案:

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

我终于找到了解决方案:

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

0.77667e1
是(几乎)
7.766667
,它们在两种不同的表示中是相同的数字,精度略有不同。如果将第一个文件转储到
irb
,您将看到:

> 0.77666666666666667e1
 => 7.766666666666667 
在数据库中执行
avg
时,结果的类型为
numeric
,ActiveRecord使用Ruby的
BigDecimal
表示该类型。
BigDecimal
值以科学记数法显示,但在格式化数据以供显示时,这不会产生任何影响

在任何情况下,
pluck
都不是此作业的正确工具,您希望使用
average

Model.group(:p_id).average(:desired)

这将为您提供一个将p_id映射到平均值的散列。你仍然可以得到BigDecimal的平均值,但这真的不应该是个问题。

0.7766667e1
是(几乎)7.7666666667,它们在两种不同的表示中是相同的数字,精度略有不同。如果将第一个文件转储到
irb
,您将看到:

> 0.77666666666666667e1
 => 7.766666666666667 
在数据库中执行
avg
时,结果的类型为
numeric
,ActiveRecord使用Ruby的
BigDecimal
表示该类型。
BigDecimal
值以科学记数法显示,但在格式化数据以供显示时,这不会产生任何影响

在任何情况下,
pluck
都不是此作业的正确工具,您希望使用
average

Model.group(:p_id).average(:desired)

这将为您提供一个将p_id映射到平均值的散列。你仍然可以得到
BigDecimal
s中的平均值,但这真的不应该是一个问题。

@mu简而言之,谢谢你的回答,这是一个很好的解释,但有两件事在哪里:1。代码返回的哈希值为BigDecimal 2。我仍然需要使用Pull,因为我在不同的字段上有6种不同的计算。但是
BigDecimal
有什么问题吗?@mu简而言之,谢谢你的回答,这是很好的解释,但有两件事在哪里:1。代码返回的哈希值为BigDecimal 2。我仍然必须使用Pull,因为我在不同的字段上有6种不同的计算。但是
BigDecimal
有什么问题?