ActiveRecord::StatementInvalID in ManagementController#indexPG::Error: ERROR: column "estates.ID" must appear in the GROUP BY clause or be used in an aggregate functionliNE 1: SELECT "estates".* FROM "estates" WHERE "estates"."Mgmt" = ... ^: SELECT "estates".* FROM "estates" WHERE "estates"."Mgmt" = 'Mazzey' GROUP BY user_ID@myestate = Estate.where(:Mgmt => current_user.Company).group(:user_ID).all如果user_ID是PRIMARY KEY,那么需要升级Postgresql;较新的版本将正确处理主键的分组。
如果user_ID既不是唯一的,也不是所讨论的’estates’关系的主键,那么这个查询没有什么意义,因为Postgresql无法知道为每个共享相同列的每个列的列返回哪个值用户名。您必须使用表达您想要的集合函数,如min,max,avg,string_agg,array_agg等,或者添加GROUP BY感兴趣的列。
或者,您可以重新使用查询以使用disTINCT ON和ORDER BY,如果您确实想要选择一个有点任意的行,但我真的怀疑可以通过ActiveRecord来表达。
一些数据库(包括sqlite和MysqL)只会选择任意一行。 Postgresql团队认为这是错误的和不安全的,所以Postgresql遵循sql标准,并将这些查询视为错误。
如果你有:
col1 col2fred 42bob 9fred 44fred 99
你做:
SELECT col1,col2 FROM mytable GROUP BY col1;
那么很明显你应该得到这个行:
bob 9
但是fred的结果呢?没有一个正确的答案选择,所以数据库将拒绝执行这样的不安全的查询。如果您想要任何col1最大的col2,您将使用最大聚合:
SELECT col1,max(col2) AS max_col2 FROM mytable GROUP BY col1;总结
以上是内存溢出为你收集整理的PostgreSQL -must出现在GROUP BY子句中,或者在聚合函数中使用全部内容,希望文章能够帮你解决PostgreSQL -must出现在GROUP BY子句中,或者在聚合函数中使用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)