1

なぜこれが私を困惑させたのかわかりませんが、それを行う方法がわかりません。

私は 50 万のセッションを持つテーブルを持っており、時間の初めから 1 日ごとに異なる MAC アドレスの平均数を取得する必要があります。

私はこれを試しました:

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

(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

結果は常に 10 ではなく 20 です。

クエリはどのように見えるはずですか? どんな助けでも大歓迎です-マインドブロックを持っています。

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

これについては完全にはわかりませんが、後で Chronic を使用するのではなく、SQL で日付を解析する必要があるかどうか疑問に思います。また、アレル平均は値の順序付きハッシュを返すと考えているため、これは私の試みです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 に答える