Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按rails中的时间跨度分组_Sql_Ruby On Rails_Activerecord - Fatal编程技术网

Sql 按rails中的时间跨度分组

Sql 按rails中的时间跨度分组,sql,ruby-on-rails,activerecord,Sql,Ruby On Rails,Activerecord,我希望根据创建记录的时间从users表中获取输出。时间存储在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 我无法按创建的组进行分组。我找到的解决方案是创建另一列,比如时间跨度,并将该列更新为凌晨2点至6点,如果

我希望根据创建记录的时间从users表中获取输出。时间存储在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

我无法按创建的组进行分组。我找到的解决方案是创建另一列,比如时间跨度,并将该列更新为凌晨2点至6点,如果创建的时间跨度在该跨度内,那么我可以按时间跨度列进行分组。有更好的解决方案吗?

我的建议是在数据库中创建另一列,这样可以避免以牺牲一个简单列为代价来计算select

我不知道你说的不能使用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}"}
hours=Users.all.collect{| u | u.created_at.hour}
范围=[(2…6)、(6…10)、(10…14)、(14…18)、(18…22)、(22…26)]
summary=hours.group_by{h | ranges.find{r | r==(h