【问题标题】:ActiveRecord AVG calculationActiveRecord AVG 计算
【发布时间】:2017-12-01 07:16:11
【问题描述】:

我有要求:

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 值?

【问题讨论】:

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


    【解决方案1】:

    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 映射到平均值的哈希值。您仍然可以在 BigDecimals 中获得平均值,但这应该不是问题。

    【讨论】:

    • @mu-is-to-short 谢谢你的回答,这是很好的解释,但有两件事:1.你的代码返回带有 BigDecimal 的哈希 2.我仍然必须使用 pluck 因为我在不同的字段上有 6 种不同的计算。
    • 但是BigDecimal有什么问题?
    【解决方案2】:

    终于找到解决办法了:

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

    【讨论】:

      猜你喜欢
      • 2021-12-17
      • 2023-03-30
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 2023-03-19
      相关资源
      最近更新 更多