按 PostgreSQL 中的指定列分组

Posted

技术标签:

【中文标题】按 PostgreSQL 中的指定列分组【英文标题】:Group by specified column in PostgreSQL 【发布时间】:2011-12-20 12:52:56 【问题描述】:

也许,这个问题有点愚蠢,但我很困惑。

如何按指定列对记录进行分组? :)

Item.group(:category_id)

没有用...

上面写着:

ActiveRecord::StatementInvalid: PGError: ERROR: column "items.id" 必须出现在 GROUP BY 子句中或在聚合函数中使用 第 1 行:SELECT "items".* FROM "items" GROUP BY category_id

我应该使用什么样的聚合函数?

请你提供一个简单的例子。

【问题讨论】:

【参考方案1】:

您必须定义如何对共享相同category_id 的值进行分组。连接它们?计算一个总和?

要创建以逗号分隔的值列表,您的语句可能如下所示:

SELECT category_id
      ,string_agg(col1, ', ') AS col1_list
      ,string_agg(col2, ', ') AS col2_list
FROM   items
GROUP  BY category_id

string_agg(col1, ', ') 需要 Postgres 9.0 或更高版本。 在旧版本中,您可以替换为 array_to_string(array_agg(col1), ', ')。更多聚合函数here.

在 PostgreSQL 中聚合值显然是优于在客户端聚合值的方法。 Postgres 在这方面非常快,它减少了(网络)流量。

【讨论】:

【参考方案2】:

您可以使用sumavgcount 或任何其他聚合函数。有关此主题的更多信息,您可以找到here。

但您似乎并不真的需要使用 SQL 分组。

尝试获取所有记录,然后使用Array#collect 函数将Items 按category_id 分组

【讨论】:

【参考方案3】:

SQL 中的分组意味着服务器将数据库表中的一个或多个记录分组一个结果行。因此,例如,如果您按category_id 分组,您可能有多个与给定类别匹配的记录,因此您不能期望数据库从表中返回 all 列(这就是 SELECT *确实如此)。

相反,当您使用GROUP BY 时,您只能使用SELECT

您分组的列,和/或 对属于结果组的所有记录执行的聚合函数

根据您的确切需要,相应地修改您的.select

【讨论】:

以上是关于按 PostgreSQL 中的指定列分组的主要内容,如果未能解决你的问题,请参考以下文章

将列分组为一行,忽略 postgreSQL 中的空值

获取表中不同列的最新 NOT NULL 值,按公共列分组

如何获得 PostgreSQL 中的两个平均值之间的差异,平均值在列上,最终表按两列分组?

PostgreSQL - 按两列分组并使用一列作为结果列

PostgreSQL 按总和分组

按 Hive 中的列分组