In Postgres 8.4 or later, this is probably a good starting point:
SELECT id_field, array_agg(value_field1), array_agg(value_field2)
FROM data_table
GROUP BY id_field
The array_agg function returns an array, but you can CAST that to text and edit as needed (see clarifications, below).
Prior to version 8.4, you have to define the method yourself prior to use:
CREATE AGGREGATE array_agg (anyelement)
(
sfunc = array_append,
stype = anyarray,
initcond = '{}'
);
(paraphrased from the PostgreSQL documentation)
Clarifications:
- The result of casting an array to text is that the resulting string starts and ends with curly braces. Those braces will need to be removed by some method if they are not desired.
- Casting ANYARRAY to TEXT best simulates CSV output as elements that contain embedded commas are double-quoted in the output in standard CSV style. Neither
array_to_string() or string_agg() (the group_concat analogous function added in 9.0) quote strings with embedded commas, resulting in an incorrect number of elements in the resulting list.
- The new 9.0
string_agg() function does NOT cast the inner results to TEXT first. So string_agg(value_field) would generate an error if value_field is an integer. string_agg(value_field::text) would be required. The array_agg() method requires only one cast after the aggregation (rather than a cast per value).