【问题标题】:Group records by created_at in ActiveRecord在 ActiveRecord 中按 created_at 分组记录
【发布时间】:2017-11-14 19:35:08
【问题描述】:

我试图找出在给定的一天创建了多少条记录,以获得这样的结果:

User uploaded 5 objects two days ago

User uploaded 12 objects 21 days ago

我试过了:

Flight.group("created_at::date")

但得到错误:

ActiveRecord::StatementInvalid: PG::GroupingError: ERROR:  column "flights.id" must appear in the GROUP BY clause or be used in an aggregate function

但是当我尝试将id 直接添加到组字段或添加另一个.group 时,我最终会同时对id 和created_at 进行分组,这显然不会对任何内容进行分组,因为会有只能是每个匹配的一个实例。

我在这里缺少什么?

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord group-by rails-activerecord


    【解决方案1】:

    如果您要数数,请数数:

    Flight.group('created_at::date').count         # PostgreSQL-only
    Flight.group('date(created_at)').count         # PostgreSQL and AFAIK MySQL
    Flight.group('cast(created_at as date)').count # Standard SQL
    

    这将为您提供一个哈希值,其中日期为键,计数为值。否则,数据库将不知道应该使用组中行中的哪些值来表示组。如果您添加 count 聚合函数,那么歧义就消失了,数据库知道您想要它做什么。

    【讨论】:

    • 天啊。太明显了!谢谢!
    • 对于使用 MySQL 的用户,您需要 Model.group('date(created_at)').count
    • @nickcoxdotme 这实际上也适用于 PostgreSQL,cast(created_at as date) 应该适用于任何地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 2016-05-10
    • 1970-01-01
    • 2017-04-05
    • 2015-01-30
    • 1970-01-01
    • 2014-01-31
    相关资源
    最近更新 更多