如何用Rails及Groupdate gem统计每月发布超X个视频的用户数?
统计每月发布超过X个视频的用户数量(Rails + Groupdate)
方法一:内存中处理(适合小数据量)
先获取每个用户每月的视频发布数,再筛选出符合条件的用户并统计数量:
# 设定阈值X,替换为你需要的数值 x = 2 # 按月份和用户分组,统计每个用户当月的视频数 user_monthly_video_counts = Video.group_by_month(:created_at).group(:user_id).count # 遍历每个月份,统计视频数超过X的用户数量 result = user_monthly_video_counts.transform_values do |user_counts| user_counts.count { |_, count| count > x } end
返回结果格式和你原代码的输出一致,示例:
{ Mon, 01 Aug 2022=>80, Thu, 01 Sep 2022=>75, Sat, 01 Oct 2022=>78, ... }
方法二:数据库层面过滤(适合大数据量,性能更优)
通过子查询在数据库中直接筛选出每月发布视频数超过X的用户,再按月份统计数量,避免把大量数据加载到内存:
x = 2 result = Video # 先按月份和用户分组,筛选出视频数超过X的记录 .group_by_month(:created_at) .group(:user_id) .having("COUNT(*) > ?", x) # 再按月份分组,统计符合条件的用户数 .group_by_month(:created_at) .count("DISTINCT user_id")
也可以用更清晰的子查询写法:
x = 2 # 子查询:获取每月发布视频数超过X的用户及对应月份 qualified_user_months = Video .select("DATE_TRUNC('month', created_at) as month, user_id") .group(:month, :user_id) .having("COUNT(*) > ?", x) # 按月份统计符合条件的用户数量 result = qualified_user_months .group_by_month(:month) .count("DISTINCT user_id")
说明
- 两种方法都能输出你需要的按月分组统计结果,格式与原代码返回的一致。
- 方法二更适合数据量大的场景,所有过滤逻辑在数据库完成,能有效减少内存占用和数据传输开销。
- 你可以根据需求自由调整
x的数值,比如设为3就是统计每月发布超过3个视频的用户。
内容的提问来源于stack exchange,提问作者Dan Weaver
相关产品推荐
相关产品推荐

