Группа Postgresql CONCAT эквивалентна?


у меня есть таблица, и я хотел бы вытащить одну строку на идентификатор с Объединенными значениями полей.

В моей таблице, например, у меня есть это:

TM67 | 4  | 32556
TM67 | 9  | 98200
TM67 | 72 | 22300
TM99 | 2  | 23009
TM99 | 3  | 11200

и я хотел бы вывести:

TM67 | 4,9,72 | 32556,98200,22300
TM99 | 2,3    | 23009,11200

в MySQL я смог использовать агрегатную функцию GROUP_CONCAT, но это, кажется, не работает здесь... Есть ли эквивалент для PostgreSQL или другой способ сделать это?

4 184

4 ответа:

вероятно, это хорошая отправная точка (версия 8.4+ только):

SELECT id_field, array_agg(value_field1), array_agg(value_field2)
FROM data_table
GROUP BY id_field

array_agg возвращает массив, но вы можете привести его к тексту и редактировать по мере необходимости (см. пояснения ниже).

до версии 8.4, вы должны определить его самостоятельно перед использованием:

CREATE AGGREGATE array_agg (anyelement)
(
    sfunc = array_append,
    stype = anyarray,
    initcond = '{}'
);

(перефразировано из документации PostgreSQL)

пояснения:

  • результатом приведения массива к тексту является то, что результирующая строка начинается и заканчивается фигурными скобками. Эти фигурные скобки должны быть удалены каким-то методом, если они не нужны.
  • приведение ANYARRAY к тексту лучше всего имитирует вывод 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 () требует только одного приведения после агрегации (а не приведения на значение).

С 9.0 это еще проще:

SELECT id, 
       string_agg(some_column, ',')
FROM the_table
GROUP BY id
SELECT array_to_string(array(SELECT a FROM b),', ');

тоже подойдет.

попробуйте так:

select field1, array_to_string(array_agg(field2), ',')
from table1
group by field1;