分组用户 - 按月累计计数

时间:2015-09-11 13:37:05

标签: mysql ruby-on-rails ruby database grouping

我可以按月计算每个月的用户数:

User.group('year(created_at)').group('month(created_at)').count
#=> {[2015, 4]=>90, [2015, 5]=>133, [2015, 6]=>131, [2015, 7]=>28, [2015, 8]=>45, [2015, 9]=>6}

我想创建统计数据,显示用户数量增长数月。

所以它会返回这样的东西:

{[2015, 4]=>20, [2015, 5]=>40, [2015, 6]=>55, [2015, 7]=>70, [2015, 8]=>100, [2015, 9]=>130}
# each entry is a year, month and total users count from the beginning of time by the end of this month.

我如何得到想要的结果?

我正在寻找数据库级解决方案(ActiveRecord查询)。

任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:0)

所以,如果我误解了任何事情,请纠正我。您有几个月的用户注册,即1月份的1个用户,2月份的2个用户和3月份的3个用户,并且您希望构建一个用户增长的图表,因此您希望1月份有1个用户,2月份有3个用户,3月份有6个用户。 如果是这种情况,您可以执行以下操作:

counts = {[2015, 4]=>1, [2015, 5]=>2, [2015, 6]=>3, [2015, 7]=>4, [2015, 8]=>5, [2015, 9]=>6}     

keys = counts.keys # save keys => [[2015, 4], [2015, 5], [2015, 6], [2015, 7], [2015, 8], [2015, 9]]

acc_values = counts.values.dup # .dup is needed if you don't want to spoil original values  
# because of for the following map! operation, 
# right now acc_values returns => [1, 2, 3, 4, 5, 6]

# use map! instead of map so we have access to already changed items, 
# while we iterating over the next
acc_values.map!.with_index { |val, key| key.zero? ? val : acc_values[key - 1] + val }    
# => [1, 3, 6, 10, 15, 21]

# build resulting hash
acc_counts = keys.zip(acc_values).to_h    
# => {[2015, 4]=>1, [2015, 5]=>3, [2015, 6]=>6, [2015, 7]=>10, [2015, 8]=>15, [2015, 9]=>21}

答案 1 :(得分:0)

如果g是给定哈希,其中g[[y,m]]是年y,月m中的新用户数,并且您想要创建哈希{{1} } h是年h[[y,m]],月y的累计用户数,四舍五入到最近的m5可按如下方式计算:

h

如果我误解了这个问题,请告诉我(例如,您可能打算在数据库中这样做)。如果是这样,我会修改或删除我的答案。