Rails:在添加最后值时对组和求和(Fibonacci)

时间:2018-05-02 10:32:35

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

我试图将每月的报价总和,同时加上最后一笔金额。

例如:

Jan: 300€
Fev: 200€
Mars: 100€

小组应该返回的是:

Jan:300€
Fev: 500€ (200 + Jan's 300)
Mars: 600€ (100 + Fev's 500)

当前SQL:

current_user.quotes.group_by_month(:created_at, last: 12).sum(:price)

我正在使用groupdate宝石。

感谢。

3 个答案:

答案 0 :(得分:4)

如果使用postgresql,您可以使用 Windows功能

  1. UNBOUNDED PRECEDING第一行,CURRENT ROW当前行
  2. 使用sum函数累计
  3. 像这样。

    select name,sum(price) 
             over(order by (select 1) ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)  "price"
    from T
    

    sqlfidde:http://sqlfiddle.com/#!17/763e3/7

    Widows function

答案 1 :(得分:1)

Ruby中的解决方案:

s = 0
current_user.quotes.group_by_month(:created_at, last: 12).
  sum(:price).
  transform_values.map { |v| s += v }

由于只有12个元素的哈希,我建议使用ruby而不是sql的性能损失是微不足道的。使用SQL会更加困难,只有使用简单的ActiveRecord Arel方法或可能是特定于数据库的方法才能实现,请参阅例如Calculating Cumulative Sum in PostgreSQL

答案 2 :(得分:1)

我们可以使用以下代码

 quotes = current_user.quotes
 sum = 0
 quotes.each_with_object({}) do |quote,hassh|
     hassh[quote.name] = sum = quote.price + sum
 end
 hassh