Эквивалентный Postgresql GROUP_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 или другой способ выполнить это?

236
задан a_horse_with_no_name 16 October 2016 в 22:53
поделиться

1 ответ

Вероятно, это хорошая отправная точка (только для версии 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 в 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 () требуется только одно приведение после агрегирования (а не приведение для каждого значения).
220
ответ дан 23 November 2019 в 03:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: