按时间跨度分组

时间:2013-07-03 05:32:55

标签: sql ruby-on-rails activerecord

我想根据创建记录的时间从用户表中获取输出。时间存储在created_at列中。

输出将如下:

Time             user count
2 am - 6 am       10
6 am - 10 am      5
10 am - 2 pm      5
2 pm - 6 pm      5
6 pm - 10 pm      5
10 pm - 2 am      5

我无法通过created_at进行分组。我找到的解决方案是创建另一个列说time_span并将该列更新为凌晨2点 - 早上6点如果created_at时间落在此范围内,那么我可以在time_span列上执行group_by。有更好的解决方案吗?

2 个答案:

答案 0 :(得分:0)

我的建议是在数据库上创建另一个列,这样就可以避免以简单列为代价对选择进行计算。

答案 1 :(得分:0)

我不确定你不能使用group_by是什么意思,但以下内容可行:

hours = Users.all.collect {|u| u.created_at.hour}
ranges = [(2...6), (6...10), (10...14), (14...18), (18...22), (22...26)]
summary = hours.group_by {|h| ranges.find {|r| r === (h<2 ? h+24 : h)}}
ranges.each {|r| puts "#{r} = #{(summary[r] || []).length}"}

可能有机会简化这一点,如果您愿意,可以将分组推送到数据库中,但我想我会继续分享。