使用Rails,我怎样才能查询数据库中的总数并按周分组?[英] With Rails, how can I query the db for an aggregate number and grouped by week?

本文是小编为大家收集整理的关于使用Rails,我怎样才能查询数据库中的总数并按周分组?的处理方法,想解了使用Rails,我怎样才能查询数据库中的总数并按周分组?的问题怎么解决?使用Rails,我怎样才能查询数据库中的总数并按周分组?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

给定一个这样的表格:

日志:

id, user_id, points, created_at

使用 Rails,我如何通过 user_id 查询数据库,然后通过 created_at 按周分组,然后我可以得到类似的东西:

   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}

这里的key是[年,周],那么你可以使用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 用作数据类型格式化函数.

本文地址:https://www.itbaoku.cn/post/1764071.html