GroupingError:错误:列“”必须出现在GROUP BY子句中或用于聚合函数

我正在尝试创建一个留下评论的独特患者列表。 代码字很好,直到我上传到heroku,它在postgresql中不起作用。

这是我创建列表的Ruby .erb代码:

 

Lastest comment from ago

@comments在控制器中定义为:

 def index @comments = current_clinician.comments.order("created_at desc") end 

heroku日志给我这个错误信息:

 PG::GroupingError: ERROR: column "comments.id" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: SELECT "comments".* FROM "comments" WHERE comments"."clini... ^ SELECT "comments".* *FROM "comments" WHERE "comments"."clinician_id" = $1 GROUP BY patient_id ORDER BY created_at desc 

我尝试过其他SO问题的解决方案,例如20942477 。 其中说我应该将字段comments.id添加到我的组子句中:

  

这消除了heroku上的错误但是失败了组命令的目的 – 它不再仅显示独特的患者,而是列出所有这些。

我也尝试过1780893的解决方案。 哪个说我应该改变ORDER BY:

 @comments = current_clinician.comments.order("substring(created_at,1.8) desc") 

哪个在本地出现此错误:

SQLite3 :: SQLException:没有这样的函数:substring:SELECT“comments”。* FROM“comments”WHERE“comments”。“clinician_id”=? ORDER BY substring(created_at,1.8)desc

我意识到这是一个常见问题,我对SQL缺乏经验,因此我无法获取代码,因此它可以在我的开发和生产环境中工作。 我在SO上读到的答案并没有使用Ruby来获取SQL并超过我的经验水平。

你不能在Postgres中将SELECT *GROUP BY some_column结合使用(除非some_column是PK),因为这是一个矛盾。 所有非聚合列(在聚合函数外部的SELECTHAVINGORDER BY子句中使用)必须位于GROUP BY列表中 – 其中主键列可以替换表的所有列。 否则,未定义从聚合集中选择哪个值。

每个文件:

当存在GROUP BY或存在任何聚合函数时, SELECT列表表达式无法引用未聚合的列,但聚合函数内或未分组的列在function上依赖于分组列,因为否则会有更多比未归属列返回的一个可能值。 如果分组列(或其子集)是包含未分组列的表的主键,则存在function依赖性。

已知某个其他RDBMS在这里玩肮脏的技巧并允许这个并选择任意值……

您似乎想要一份评论的独特患者列表,每个患者都有最新评论。 Postgres中最简单的方法是使用DISTINCT ON

 SELECT DISTINCT ON (patient_id) * FROM comments WHERE clinician_id = $1 ORDER BY patient_id, created_at DESC NULLS LAST; 

但这不会与SQLite一起出现 – 它不应该在循环中开始:

  • SQLite3“LIKE”或PostgreSQL“ILIKE”的通用Ruby解决方案?

NULLS LAST仅在created_at可以为NULL时才相关:

  • PostgreSQL按日期时间asc排序,先是null吗?

DISTINCT ON详细信息:

  • 选择每个GROUP BY组中的第一行?