使用Rails,如何查询数据库以获取总数并按周分组?
给出一个像这样的表格:
日志:
id, user_id, points, created_at
使用Rails,我如何通过user_id查询数据库,然后通过created_at逐周查询GROUPED,然后我可以使用以下内容:
WEEK of X/XX/XXXX - 3011 total points WEEK of X/XX/XXXX - 320 total points WEEK of X/XX/XXXX - 31 total points WEEK of X/XX/XXXX - 30330 total points
谢谢
points_by_week = Log.where(user_id: user_id).group("DATE_TRUNC('year', created_at)", "DATE_TRUNC('week', created_at)").sum(:points)
会产生像这样的结果
{[2014, 4]=>3, [2014, 8]=>7, [2015, 4]=>26, [2015, 6]=>19, [2015, 12]=>50, [2015, 32]=>48, [2016, 2]=>78, [2016, 3]=>45, [2016, 4]=>49, [2016, 5]=>110, [2016, 45]=>30, [2017, 4]=>130, [2017, 11]=>185}
密钥是[年,周],那么你可以使用Date.commercial来获得周
points_by_week.each do |(year, week), count| date = Date.commercial(year, week) puts "Week of #{date.strftime('%d/%m/%Y')} - #{count} total points" end
并且(因为我可以),查询的mysql版本看起来像这样
points_by_week = Log.where(user_id: user_id).group("year(created_at)", "week(created_at)").sum(:points)
默认情况下,假设星期一开始,一年的第一周从一年的第一个星期一开始
就像是:
points_by_week = Log.select("DATE_TRUNC('week', created_at) as week, sum(points) as total_points").group("week").where(user_id: x) points_by_week.each do |pw| puts "Week of #{pw.week.strftime('%d/%m/%Y')} - #{pw.total_points} total points" end
编辑
根据Michael Gorman的评论,上述内容不会区分年份(2017年,2016年等),因此您可能需要根据您的要求按周和年分组:
Log.select("DATE_TRUNC('week', created_at) as week, DATE_TRUNC('year', created_at) as year, sum(points) as total_points").group("week, year")
你可以继续使用上面的循环来显示它;)
像这样的东西:
select 'WEEK of ' || TO_CHAR(date_trunc( 'week', created_at ), 'dd/mm/yyyy') || ' - ' || sum(points) || ' total points' FROM clients WHERE id < 100000 GROUP BY date_trunc( 'week', created_at );
||
用于连接字符串。
TO_CHAR
用作数据类型格式化函数。
- 如何在Sinatra / Active Record中限制数据库字符串值的字符/字数?
- Rails:仅当另一个字段存在时才validation字段
- ‘includes’方法似乎不适用于Rails 4中的’where’
- Rails / ActiveRecord – AdapterNotSpecified,即使它是
- 如何确保不通过activerecords将重复的行添加到我的数据库表中?
- 将Postgres查询转换为Rails ActiveRecord?
- Heroku“psql:FATAL:剩余的连接插槽保留用于非复制超级用户连接”
- rails中的活动管理员 – csv限制
- 使用Ruby / Rails ORM建模inheritance