2011-12-20 3 views
1

Возможно, этот вопрос немного глуп, но я в замешательстве.Группа по указанному столбцу в PostgreSQL

Как сгруппировать записи по указанному столбцу? :)

Item.group(:category_id) 

does't работы ...

Он говорит:

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-группировку.

Попробуйте извлечь все записи, а затем использовать функцию Array#collect группу Item комиссионки category_id

2

Вы должны определить, как к значениям группы, которые разделяют то же 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 означает, что сервер групподин или несколько записи из таблицы базы данных в одном в результате строки. Итак, если вы, например, group by category_id, у вас может быть несколько записей, соответствующих данной категории, поэтому вы не можете ожидать, что база данных вернет все столбцов из таблицы (это то, что на самом деле делает SELECT *).

Вместо этого, когда вы используете GROUP BY, вы можете только SELECT:

  • столбцы сгруппировали по и/или
  • агрегатные функции, которые выполняются на всех записях, относящихся к полученной группе

В зависимости от того, что вам нужно, внесите изменения .select соответственно.

Смежные вопросы