ruby-on-rails - ActiveRecord AVG 计算

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

现在我正在努力完成其他任务,我需要 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/

相关文章:

python - 将数据库模式迁移到 Heroku (Postgres) 时遇到问题

sql - 直接通过 block 范围索引 (BRIN) 标识符查询 Postgres 表

ruby-on-rails - ActiveRecord 有 Lint 吗?

ruby-on-rails - 我如何运行一个 ruby​​ 脚本,我把它放在我的 Rails 应用程序的 my/lib/tasks/directory 中一次?

sql - 如何查找一个函数是否存在于 PostgreSQL 中以及存在于何处?

ruby-on-rails - 事件记录 : get all dates in multiple ranges

mysql - 如何为 mysql 设置 ActiveRecord 查询超时?

ruby-on-rails - Capistrano 3,使用上传!在 lib/capistrano/tasks 的任务中

ruby-on-rails - 设置 Rails 时出错——找不到 gem "actionview"

ruby-on-rails - 实用排队论