1

不知道为什么这让我如此难过,但我不知道该怎么做。

我有一张有 50 万个会话的表,从一开始就需要每天获取不同 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。

查询应该是什么样子?任何帮助表示赞赏 - 有一个思维障碍。

4

2 回答 2

2

您可能必须使用分组功能,因为不清楚 starttime 的确切存储格式是什么,但这应该适合您:

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 在类似的模式上进行了测试,似乎可以工作。

于 2013-02-10T07:39:01.067 回答
1

我对此并不完全确定,但想知道您是否需要在 SQL 中解析日期而不是之后使用 Chronic,并且还认为 arel 平均值将返回值的有序散列,因此这是我的尝试认为有效,尽管使用 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
于 2013-02-09T21:20:07.227 回答