Este es probablemente un buen punto de partida (solo la versión 8.4+):
SELECT id_field, array_agg(value_field1), array_agg(value_field2)
FROM data_table
GROUP BY id_field
array_agg devuelve una matriz, pero puede ENVIARLA al texto y editarla según sea necesario (consulte las aclaraciones a continuación).
Antes de la versión 8.4, debe definirlo usted mismo antes de usar:
CREATE AGGREGATE array_agg (anyelement)
(
sfunc = array_append,
stype = anyarray,
initcond = '{}'
);
(parafraseado de la documentación de PostgreSQL)
Aclaraciones:
- El resultado de convertir una matriz en texto es que la cadena resultante comienza y termina con llaves. Esos brackets deben eliminarse por algún método, si no se desean.
- Transmitir ANYARRAY a TEXT simula mejor la salida CSV ya que los elementos que contienen comas incrustadas se citan dos veces en la salida en el estilo CSV estándar. Ni array_to_string () ni string_agg () (la función "group_concat" agregada en 9.1) citan cadenas con comas incrustadas, lo que resulta en un número incorrecto de elementos en la lista resultante.
- La nueva función 9.1 string_agg () NO convierte primero los resultados internos a TEXTO. Entonces "string_agg (value_field)" generaría un error si value_field es un entero. Se requeriría "string_agg (value_field :: text)". El método array_agg () requiere solo una conversión después de la agregación (en lugar de una conversión por valor).