在Rails3中选择每天的平均不同值

时间:2013-02-09 16:45:53

标签: ruby-on-rails ruby ruby-on-rails-3

不知道为什么这让我如此难过,但我无法弄明白该怎么做。

我有一个包含五十万个会话的表,需要从一开始就获得每天不同mac地址的平均数。

我试过这个:

def self.average_users_per_day
  self.average("distinct mac", :group => Chronic.parse("starttime"))
end

(使用Chronic,因为starttime是一个带有时区的字符串..已尝试过DATE(“starttime”)

在一大堆数据中,我得到了我认为正确的数字。直到我运行一些测试并发现它实际上并没有对结果进行分组。

it "finds the average sessions per day", :focus => true do
  10.times do
    FactoryGirl.create(:session, starttime: Time.now, mac: (1..6).map{"%0.2X"%rand(256)}.join(":") )
  end

  10.times do
    FactoryGirl.create(:session, starttime: Time.now - 1.days, mac: (1..6).map{"%0.2X"%rand(256)}.join(":") )
  end
  Session.average_users_per_day.to_i.should eq 10
end

结果总是20而不是10。

查询应该是什么样的?任何帮助表示赞赏 - 有心灵障碍。

2 个答案:

答案 0 :(得分:2)

你可能不得不处理分组功能,因为它不清楚startime的确切存储格式是什么,但这对你有用:

def self.average_users_per_day
  self.from("(SELECT COUNT(DISTINCT mac) AS macs FROM #{self.quoted_table_name} GROUP BY DATE(startime)) AS counts").average("macs").to_f
end

刚刚使用mysql在类似架构上测试过,似乎有用。

答案 1 :(得分:1)

我对此并不完全确定,但是想知道你是否需要在SQL中解析日期而不是之后使用Chronic,并且还认为arel average会返回一个有序的值哈希,因此这是我的尽管使用SQLite特定的substr函数从时间字符串中提取日期

,但我认为这种尝试有效
def self.average_users_per_day
  sessions_per_day = self.select('distinct mac').group('substr(starttime, 0,11)').size.values
  sessions_per_day.inject(:+).to_f / sessions_per_day.size
end

此外,这会返回一个浮点数,因此将规范调整为:

Session.average_users_per_day.should eq 10.0