Postgres - 按多列Rails分组

时间:2018-03-14 12:10:13

标签: ruby-on-rails postgresql

我有一个名为property_audit_version_histories的表。 我正在使用以下代码获取记录

@version_logs = PropertyAuditVersionHistory
                    .includes(:property_audit_version, :user)
                    .where(property_audit_version_id: params[:id])

结果包含3条记录,其中2条记录具有相同的操作和user_id 现在我需要使用列动作user_id

对记录进行分组

当我尝试对记录进行分组时,我收到以下错误

@version_logs = PropertyAuditVersionHistory
                        .includes(:property_audit_version, :user)
                        .where(property_audit_version_id: params[:id])
                        .group("action, user_id")

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

基于线程PG::GroupingError: ERROR: column "events.id" must appear in the GROUP BY clause or be used in an aggregate function我修改了代码如下

@version_logs = PropertyAuditVersionHistory
                    .includes(:property_audit_version, :user)
                    .group("property_audit_version_histories.id")
                    .where(property_audit_version_id: params[:id])
                    .group("action, user_id")

现在错误已经消失,但结果仍有3条记录。分组后,我只期望2条记录。 enter image description here

有关如何解决这个问题的想法吗?

2 个答案:

答案 0 :(得分:0)

在进行聚合时,你无法在postgresql中选择像mysql这样的所有列。

所以我想这应该有用。

@version_logs = PropertyAuditVersionHistory    
                    .where(property_audit_version_id: params[:id])
                    .group("action", "user_id", "property_audit_version_id")
                    .select("user_id", "action", "property_audit_version_id")

我不知道你的模型怎么样但这应该有效。如果您需要更多字段,请告诉我

答案 1 :(得分:0)

您需要做的是使用

指定所需的列
  .select("user_id")

但是对于您知道的列将使用相同的max(columnName) as columnName

例如:

.select("MAX(user_id) as user_id, action")

确保在分组后确保这些列的值相同。