按PostgreSQL中的指定列分组

时间:2011-12-20 12:52:57

标签: ruby ruby-on-rails-3 postgresql group-by

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

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

Item.group(:category_id)

不起作用......

它说:

  

ActiveRecord :: StatementInvalid:PGError:错误:列“items.id”必须出现在GROUP BY子句中或用于聚合函数   第1行:选择“项目”。* FROM“items”GROUP BY category_id

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

拜托,您能提供一个简单的例子。

3 个答案:

答案 0 :(得分:2)

您必须定义,如何对共享相同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 非常快,它减少了(网络)流量。

答案 1 :(得分:1)

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

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

尝试获取所有记录,然后使用Array#collect功能将Item分组为category_id

答案 2 :(得分:1)

在SQL中分组意味着服务器 一个或多个记录从数据库表转换为一个结果行。因此,如果您按category_id分组,则可能有多条记录与给定类别匹配,因此您不能指望数据库从表中返回所有列(这就是{ {1}}确实如此)。

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

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

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