按 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】:您可以使用sum
、avg
、count
或任何其他聚合函数。有关此主题的更多信息,您可以找到here。
但您似乎并不真的需要使用 SQL 分组。
尝试获取所有记录,然后使用Array#collect
函数将Item
s 按category_id
分组
【讨论】:
【参考方案3】:SQL 中的分组意味着服务器将数据库表中的一个或多个记录分组到一个结果行。因此,例如,如果您按category_id
分组,您可能有多个与给定类别匹配的记录,因此您不能期望数据库从表中返回 all 列(这就是 SELECT *
确实如此)。
相反,当您使用GROUP BY
时,您只能使用SELECT
:
根据您的确切需要,相应地修改您的.select
。
【讨论】:
以上是关于按 PostgreSQL 中的指定列分组的主要内容,如果未能解决你的问题,请参考以下文章