Ответ 1
Это, вероятно, хорошая отправная точка (только версия 8.4+):
SELECT id_field, array_agg(value_field1), array_agg(value_field2)
FROM data_table
GROUP BY id_field
array_agg возвращает массив, но вы можете CAST, чтобы текст и редактировать по мере необходимости (см. пояснения ниже).
До версии 8.4 вы должны сами определить ее перед использованием:
CREATE AGGREGATE array_agg (anyelement)
(
sfunc = array_append,
stype = anyarray,
initcond = '{}'
);
(перефразировано из документации PostgreSQL)
Разъяснения:
- Результатом приведения массива в текст является то, что результирующая строка начинается и заканчивается фигурными фигурными скобками. Эти скобки необходимо удалить каким-либо способом, если они не желательны.
- Листинг ANYARRAY to TEXT лучше всего имитирует вывод CSV, поскольку элементы, содержащие встроенные запятые, имеют двойные кавычки в выводе в стандартном стиле CSV. Ни array_to_string(), ни string_agg() (добавленная функция "group_concat" в 9.1) не содержат строки со встроенными запятыми, что приводит к некорректному количеству элементов в результирующем списке.
- Новая функция 9.1 string_agg() НЕ передает первые результаты в ТЕКСТ. Поэтому "string_agg (value_field)" генерирует ошибку, если value_field является целым числом. "string_agg (value_field:: text)" потребуется. Метод array_agg() требует только одного приведения после агрегации (а не приведения на значение).