Группировать по указанному столбцу в PostgreSQL - PullRequest
1 голос
/ 20 декабря 2011

Может быть, этот вопрос немного глуп, но я в замешательстве.

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

Item.group(:category_id)

не работает ...

Там написано:

ActiveRecord :: StatementInvalid: PGError: ERROR: column "items.id"должен присутствовать в предложении GROUP BY или использоваться в агрегатной функции LINE 1: SELECT" items ". * FROM" items "GROUP BY category_id

Какой тип агрегатной функции следует использовать?

Не могли бы вы привести простой пример.

Ответы [ 3 ]

2 голосов
/ 20 декабря 2011

Вам нужно будет определить, как , чтобы сгруппировать значения, которые имеют одинаковые 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), ', '). Больше агрегатных функций здесь .

Агрегировать значения в PostgreSQL - это явно лучший подход по сравнению с агрегированием значений в клиенте. Postgres очень быстр в этом, и это уменьшает (сетевой) трафик.

1 голос
/ 20 декабря 2011

Группировка в SQL означает, что сервер группирует одну или несколько записей из таблицы базы данных в одну результирующую строку.Таким образом, если вы, например, группируете по category_id, у вас может быть несколько записей, соответствующих данной категории, поэтому вы не можете ожидать, что база данных выдаст всех столбцов из таблицы (это то, что на самом деле SELECT *)делает).

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

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

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

1 голос
/ 20 декабря 2011

Вы можете использовать sum, avg, count или любую другую функцию агрегирования.Подробнее по этой теме вы можете найти здесь .

Но, похоже, вам не нужно использовать группировку SQL.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...