【问题标题】:How to return Postgres records grouped by week in Rails如何在 Rails 中返回按周分组的 Postgres 记录
【发布时间】:2020-07-04 10:11:56
【问题描述】:

Rails 查询忍者,我很难从我的 Postgres 数据库中获取按创建周分组的记录。

(在您因为重复而阻止此问题之前,请查看我已经尝试了我在 SO 其他地方找到的内容,但我的结果没有用。我仍然缺少一些东西。)

给定一个带有 created_at 时间戳的 ActiveRecord User 对象,我想快速找出一年中每周创建了多少用户。

我试过了:

> User.select("DATE_TRUNC('week', created_at) as week").group("week")
  User Load (0.4ms)  SELECT DATE_TRUNC('week', created_at) as week FROM "users" GROUP BY week
[#<User:0x00007fb73892e978 id: nil>,
 #<User:0x00007fb73892e7e8 id: nil>,
 #<User:0x00007fb73892e5e0 id: nil>,
 #<User:0x00007fb73892e400 id: nil>,
 #<User:0x00007fb73892e270 id: nil>]

这似乎有效,因为该测试数据中有 7 条记录,并且有 2 条记录在同一周,但我想要在周数旁边的总数的数字响应:

Week     Count
   1         2
   2         1
   3         1
   4         5

或哈希或任何可用的东西。

或普通的 ruby​​ User.group(:created_at).count,但我不确定如何将周数用于此查询。

感谢您的帮助!

【问题讨论】:

    标签: ruby-on-rails postgresql date


    【解决方案1】:
    User.group("DATE_TRUNC('week', created_at)").count
    

    这将为您提供一个哈希值,其中日期为键,计数为值:

    => #<User id: 2, email: "test2@example.com", created_at: "2020-03-09 22:47:51", updated_at: "2020-03-23 22:47:51", display_name: "Test2">
    irb(main):020:0> User.group("DATE_TRUNC('week', created_at)").count
       (0.4ms)  SELECT COUNT(*) AS count_all, DATE_TRUNC('week', created_at) AS date_trunc_week_created_at FROM "users" GROUP BY DATE_TRUNC('week', created_at)
    => {2020-03-23 00:00:00 UTC=>1, 2020-03-09 00:00:00 UTC=>1}
    

    您可以通过以下方式获取周数:

     User.group("DATE_TRUNC('week', created_at)")
         .count
         .transform_keys {|d| d.strftime('%V') }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-20
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      相关资源
      最近更新 更多