我有以下impression
模型,可跟踪应用内的所有用户互动:
class Impression
belongs_to :user
end
create_table :impressions do
t.string :ip_address
t.integer :user_id
t.datetime :created_at
end
我需要显示按ip_address
和created_at
(每小时)分组的所有展示次数
假设用户今天随机点击某个页面10 times
,我们就会存储10 impressions
。这些展示中的每一个都有ip_address和时间戳。
查询结果应该是:
created_at user_id ip_address count
10/08/2014 6pm 1 127.0.0.1 2
10/08/2014 4pm 1 127.0.0.1 4
10/08/2014 1pm 1 127.0.0.1 2
10/08/2014 1pm 1 82.125.121.101 1
10/08/2014 10am 1 127.0.0.1 1
在此示例中,展示次数总和为10,这是正确的。
在1pm
左右,用户访问应用程序3次,在localhost中访问两次,使用ip_address 82.125.121.101访问一次。
到目前为止,这是我的查询:
Impression.where(user_id: 1).group_by_hour(:created_at).group(:ip_address).size.order('created_at desc')
但结果既没有排序created_at desc
也没有正确计数。
我使用以下groupdate gem https://github.com/ankane/groupdate
按小时分组。
答案 0 :(得分:0)
如果您正在使用postgresql,则可以使用date_trunc
:
SELECT date_trunc('hour', created_at) AS h, ip_address, COUNT(*)
FROM users
GROUP BY h, ip_address
与您的实际问题无关,但postgresql内置了一个IP地址数据类型,您可以使用该数据类型代替字符串。我认为使用它的主要原因只是在您插入记录时强制它是一个有效的IP地址。