Rails / pg group_by两个记录之间的平均值

时间:2016-05-10 18:34:41

标签: ruby-on-rails postgresql

我有一个架构,我想计算“平均结账时间”。即图书have_many check_outs。 check_out将包含typetime列。

我想找到相应类型inout之间每本书的平均结帐时间。我对分组查询有点新意。我已经在控制台上摆弄了一段时间,但无济于事。我可以做基本的分组,但不知道如何查询效率。

我相信这是一个简单的问题,但如果复杂请提出建议。

我目前的想法是:

  1. 按book_id
  2. 对每个check_in和check_out进行分组
  3. 平均check_in日期<​​/ li>
  4. 平均check_out日期
  5. 取决于每本书的check_in - check_out

2 个答案:

答案 0 :(得分:0)

我想你想要这样的东西:

CheckOut.group(:book_id).average('check_out - check_in')

这相当于平均check_out - 平均check_in,如下所示:

CheckOut.group(:book_id).average(:check_out) - CheckOut.group(:book_id).average(:check_in)

我不确定哪个查询会更有效率,但我会猜测前者。

答案 1 :(得分:0)

因为签出和签入都是单独的记录,我认为你需要单独取出它们,就像上面的第二个选择一样。此外,我意识到答案没有意义,因为它计算两个数据集之间的差异。所以,你真的想要这样的东西:

check_outs = Check.where(check_type: :check_out).group(:book_id).average(:time)
check_ins = Check.where(check_type: :check_in).group(:book_id).average(:time)

我认为这些将是key_id上的哈希键,因此您可以遍历列表并获取值:

times = {}
check_ins.each_with_index do |v, i|
  times[i] = v - check_outs[i]
end

这里还有一个问题,那就是如果一本书目前已经签出,那么它就不会有check_in记录,而且它会甩掉平均值。