【问题标题】:Ruby Postgresl group statementRuby Postgres 组声明
【发布时间】:2012-10-27 15:28:50
【问题描述】:

我有以下 postgresql 语句,它在 Navicat for Postgresql 中工作正常,

SELECT date_trunc('day', updated_at), count(*) as total_count 
FROM "persons"
WHERE ("persons"."updated_at" BETWEEN '2012-10-17 00:00:00.000000' AND '2012-11-07   12:25:04.082224') 
GROUP BY date_trunc('day',updated_at)
ORDER BY count(updated_at) DESC

我得到了预期的结果

2012-10-31 00:00:00,5
2012-11-06 00:00:00,2
2012-11-05 00:00:00,1

我需要将其转换为 ruby​​ 用于 RoR 项目

我写了如下声明

persons = where(updated_at: start.beginning_of_day..Time.zone.now)
persons = persons.group("date(updated_at)")
persons = persons.select("updated_at, count(*) as total_count")
persons = persons.order("count(updated_at)")

但是我得到以下错误

PG::Error: ERROR:  column "persons.updated_at" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT updated_at, count(*) as total_count FROM "persons"  WH...
           ^
: SELECT updated_at, count(*) as total_count FROM "persons"  WHERE ("persons"."updated_at"     BETWEEN '2012-10-17 00:00:00.000000' AND '2012-11-07 14:38:54.674684') GROUP BY     date(persons.updated_at) ORDER BY count(updated_at)

关于我做错了什么有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    您正在选择updated_at,但您在date(updated_at) 上进行分组。您要么需要在 updated_at 上进行分组(这可能没有任何意义),要么更改您的选择以选择 date(updated_at)

    换句话说,以 Jon Day 的第二个例子为例。

    【讨论】:

      【解决方案2】:

      也许你可以试试

      persons = where(updated_at: start.beginning_of_day..Time.zone.now)
      persons = persons.group("date(updated_at), updated_at")
      persons = persons.select("updated_at, count(*) as total_count")
      persons = persons.order("count(updated_at)")
      

      persons = where(updated_at: start.beginning_of_day..Time.zone.now)
      persons = persons.group("date(updated_at)")
      persons = persons.select("date(updated_at), count(*) as total_count")
      persons = persons.order("count(updated_at)")
      

      persons = persons.find(:all, 
                             :select => "updated_at, count(*) as total_count",
                             :group => "updated_at",
                             :order => "count(updated_at)")  
      

      【讨论】:

      • 我使用了您指定的中间选项并取得了一些成功,但现在又遇到了另一个错误。 ActiveModel::MissingAttributeError:缺少属性:状态。 status 是我的 Person 类的一个属性。
      • 我也尝试将查询细化为,passes = where(updated_at: start.beginning_of_day..Time.zone.now) pass = pass.group("date(updated_at)") pass = pass.select("date(updated_at), count(*) as total_count")。但现在我得到了(对象不支持#inspect)
      • 对不起,应该是人不及格
      • 嗯,也许您可​​以发布 person 模型的代码。我认为这与模型代码有关
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多