【问题标题】:Rails - how to get grouped data from model in array?Rails - 如何从数组中的模型中获取分组数据?
【发布时间】:2013-09-18 11:22:12
【问题描述】:

我在一个 DB 表中有这种数据结构:

id | user_id | amount | created_at
 1 |    1    |   3.4  | 2013-09-14 10:10:00 
 2 |    1    |   2.1  | 2013-09-17 10:10:00
 3 |    1    |   7.9  | 2013-09-17 10:10:00
 4 |    1    |   0.2  | 2013-09-16 10:10:00
 5 |    1    |   6.3  | 2013-09-18 10:10:00
 6 |    1    |   11.9 | 2013-09-18 10:10:00

所需的输出:[0, 0, 3.4, 0, 0.2, 10, 18.2] - 我需要在数组中汇总列 amount 为过去 7 天中的每一天。

到目前为止,我能够得到这样的东西:

Model.where('user_id = ? AND created_at > ? AND created_at < ?', current_user.id, week, today).group(:created_at).sum(:amount)

产生这种格式的数据:

{2013-09-13 23:00:39 UTC=>5.68, 2013-09-16 23:30:35 UTC=>2.55}

有什么方法可以通过一次查询以我需要的格式获取数据?

编辑:设置“零天”:

  today = Date.today
  week = today - 7
  daily = Model.where('user_id = ? AND created_at > ? AND created_at < ?', current_user.id, week, today).group(:created_at).sum(:amount)
  new_value_in_array = false
  unless daily.empty?
    @daily = Array.new
    week.upto(today) do |step|
      daily.each do |d|
        if step.to_s == d[0].strftime('%Y-%m-%d').to_s
          @daily << d[1]
          new_value_in_array = true
        end
      end
      if new_value_in_array == false
        @daily <<  0
      end
      new_value_in_array = false          
    end
  end

我构建了这个 sn-p,它将检查过去一周内数据库中没有数据的日子。可以,但是我觉得不是很有效,因为如果我要查看过去一个月/3个月/6个月的数据,计算会花费很多时间。

对更有效的解决方案有什么建议吗?

非常感谢!

【问题讨论】:

    标签: sql ruby-on-rails ruby activerecord aggregate-functions


    【解决方案1】:

    这就是你想要的?

    Model.where('user_id = ? AND created_at > ? AND created_at < ?', current_user.id, week, today).group(:created_at).sum(:amount).values
    

    【讨论】:

    • 感谢您的回答techvineet,问题是,此查询生成以下输出:[3.4, 0.2, 10, 18.2] - 忽略了这些天当 sum 运算为零时。
    • 对于表中不存在的 created_at 日期,您必须自己添加这些日期以进行查询。我不认为你可以用单个查询来做到这一点
    【解决方案2】:
    start_date =  Date.today - 7
    end_date = Date.today
    
    # get sum for non zero dates
    hsh = Model.where('user_id = ? AND created_at > ? AND created_at < ?', current_user.id, start_date, end_date).group(:created_at).sum(:amount)
    # =>  [3.4, 0.2, 10, 18.2]
    
    #add zero dates to the hsh
    start_date.step(end_date,1).map{|d| hsh[d] ||= 0 }
    # => [0, 0, 3.4, 0, 0.2, 10, 18.2] 
    
    #dates with zero sum
    hsh.select{|k,v| v ==0 }.keys
    # => [2013-09-12, 2013-09-13, 2013-09-15]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-16
      相关资源
      最近更新 更多