【问题标题】:Postgres - Group by multiple columns, RailsPostgres - 按多列分组,Rails
【发布时间】:2018-08-22 23:11:19
【问题描述】:

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

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

结果包含3条记录,其中2条action和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 条记录。

知道如何解决这个问题吗?

【问题讨论】:

  • 您可以从日志中添加结果查询吗?
  • SELECT "property_audit_version_histories".* FROM "property_audit_version_histories" WHERE "property_audit_version_histories"."property_audit_version_id" = $1 GROUP BY property_audit_version_histories.id, action, user_id [["property_audit_version_id", 44]]

标签: ruby-on-rails postgresql


【解决方案1】:

你需要做的是指定你想要的列

  .select("user_id")

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

例如:

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

确保您 100% 确定分组后这些列的值相同。

【讨论】:

    【解决方案2】:

    在进行聚合时,您不能在 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")
    

    我不知道您的模型如何,但这应该可以。如果您需要更多字段,请告诉我

    【讨论】:

    • 问题是我需要在选择条件中包含 property_audit_version_histories.created_at 。一旦我添加,就会出现一个错误,说 created_at 也应该添加到组条件中。添加后将有3条记录。
    • 您可以尝试使用新版本(更新答案)吗?它应该工作。 @version_logs.each { |vl| vl.property_audit_version.created_at }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    相关资源
    最近更新 更多