2011-12-20 71 views
1

也許,這個問題有點愚蠢,但我很困惑。按PostgreSQL中的指定列分組

如何按指定列對記錄進行分組? :)

Item.group(:category_id) 

簡化版,作品...

它說:

ActiveRecord::StatementInvalid: PGError: ERROR: column "items.id" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: SELECT "items".* FROM "items" GROUP BY category_id

我應該使用什麼樣的聚合函數的?

請問您能否提供一個簡單的例子。

回答

1

您可以使用sum,avg,count或任何其他聚合函數。更多關於這個話題,你可以找到here

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

嘗試獲取所有的記錄,然後通過category_id

2

使用Array#collect功能組Item·您必須定義,如何來共享相同category_id組值。連接它們?計算總和?

要創造價值的逗號分隔的列表的語句可能看起來像這樣:

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

您需要的Postgres 9.0或更高版本爲string_agg(col1, ', ')。 在舊版本中,您可以用array_to_string(array_agg(col1), ', ')替代。更多彙總功能here

在PostgreSQL中聚合值是明顯的優越方法,而不是在客戶端聚合值。 Postgres是非常快速在這和它減少(網絡)的流量。

1

在SQL分組意味着服務器一個或多個從數據庫表記錄到一個結果行。因此,例如,如果組合爲category_id,則可能有多個記錄與給定類別匹配,因此您不能指望數據庫從表中返回所有列(這就是SELECT *實際所做的)。

相反,當你使用GROUP BY,您可以SELECT只:

  • 列已被分組,和/或
  • 這是對所有屬於結果組中的記錄進行彙集功能

根據您確切需要,請相應地修改您的.select