我有一份长达数年的活动日志。我被要求计算该应用程序每个用户的每周参与度。我将参与度定义为用户在任何一周内进行一项或多项记录活动。
我如何对这些活动进行分组并按周为每个用户计数?我已经阅读了很多不同的帖子,关于ruby 方法、sql还是 arel 语法是否最好似乎存在争议。我的用户不超过 500 个,因此性能与其说是简洁的事情一样重要。
我已经成功地尝试了这个:
user = User.first.activity_logs.group_by { |m| m.created_at.beginning_of_week }
# => {Mon, 11 Mar 2013 00:00:00 EDT -04:00=>
[#<ActivityLog id: 12345, user_id: 429, ... ]}
然后唯一的下一步是我可以毫无错误地返回任何东西:
user.map { |week| week.count } => [2, 2, 2, 2, 2, 2, 2, 2]
所以看起来我把这件事弄得太复杂了。我如何简洁地计算每周的活动数量并为每个用户执行此操作?
我只是想要一些我最终可以粘贴到电子表格(例如,下面)中的东西,以便为经理制作热图或其他图表。
| User | Week | Activity|
| ------------- | :-------------: | -------:|
| jho | 2013-1 | 20 |
| bmo | 2013-1 | 5 |
| jlo | 2013-1 | 11 |
| gdo | 2013-2 | 2 |
| gdo | 2013-5 | 3 |
| jho | 2013-6 | 5 |
编辑
作为其他人的参考:
Rails 3.1
Using PostgreSQL 9.1.4
Here is the schema file from ruby on rails
create_table "activity_logs", :force => true do |t|
t.integer "user_id"
t.string "activity_type"
t.datetime "created_at"
t.datetime "updated_at"
end
| ------+| --------+| ----------------+| ----------------+ | ----------------+ |
| id | user_id | activity_type | created_at | updated_at |
| ------+| --------+| ----------------+| ----------------+ | ----------------+ |
| 28257 | 8 | User Signin | 2013-02-14 1... | 2013-02-14 1... |
| 25878 | 7 | Password Res... | 2013-02-03 1... | 2013-02-03 1... |
| 25879 | 7 | User Signin | 2013-02-03 1... | 2013-02-03 1... |
| 25877 | 8 | Password Res... | 2013-02-03 1... | 2013-02-03 1... |
| 19325 | 8 | Created report | 2012-12-16 0... | 2012-12-16 0... |
| 19324 | 9 | Added product | 2012-12-16 0... | 2012-12-16 0... |
| 18702 | 8 | Added event | 2012-12-15 1... | 2012-12-15 1... |
| 18701 | 1 | Birthday Email | 2012-12-15 0... | 2012-12-15 0... |
| ------+| --------+| ----------------+| ----------------+ | ----------------+ |
解决方案
修改@Erwin Brandstetter 的命令,我在命令行上得到了想要的结果:
ActivityLogs.find_by_sql("
SELECT user_id, to_char(created_at, 'YYYY-WW') AS week, count(*) AS activity
FROM activity_logs
GROUP BY 1, 2
ORDER BY 1, 2;")