Вопрос

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

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

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 или другой способ добиться этого?

Это было полезно?

Решение

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

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

array_agg массив_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() требует только одного приведения после агрегирования (а не приведения для каждого значения).

Другие советы

Начиная с 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;

и версия для работы над тип массива:

select
  array_to_string(
    array(select distinct unnest(zip_codes) from table),
    ', '
);

Мое предложение в postgresql

SELECT cpf || ';' || nome || ';' || telefone  
FROM (
      SELECT cpf
            ,nome
            ,STRING_AGG(CONCAT_WS( ';' , DDD_1, TELEFONE_1),';') AS telefone 
      FROM (
            SELECT DISTINCT * 
            FROM temp_bd 
            ORDER BY cpf DESC ) AS y
      GROUP BY 1,2 ) AS x   
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top