У меня есть таблица, и я бы хотел потянуть одну строку на один идентификатор с конкатенированными значениями полей.
В моей таблице, например, у меня есть следующее:
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 возвращает массив, но вы можете CAST, чтобы текст и редактировать по мере необходимости (см. пояснения ниже).
До версии 8.4 вы должны сами определить ее перед использованием:
CREATE AGGREGATE array_agg (anyelement)
(
sfunc = array_append,
stype = anyarray,
initcond = '{}'
);
(перефразировано из документации PostgreSQL)
Разъяснения:
Начиная с 9.0 это еще проще:
SELECT id,
string_agg(some_column, ',')
FROM the_table
GROUP BY id
array_agg
), например, string_agg(some_column, ',' ORDER BY some_column)
или даже string_agg(surname || ', ' || forename, '; ' ORDER BY surname, forename)
distinct
работает с string_agg, так что можно использовать string_agg(distinct some_solumn, ',')
SELECT array_to_string(array(SELECT a FROM b),', ');
Будет делать также.
Попробуйте вот так:
select field1, array_to_string(array_agg(field2), ',')
from table1
group by field1;
Мое предложение в 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
ORDER BY
во внутреннем запросе? В любом случае заказ не потеряется?
и версия для работы с типом массива:
select
array_to_string(
array(select distinct unnest(zip_codes) from table),
', '
);
character varying(5)[]
. Кроме того, я проверил, что для моей цели - необходимо использовать unnest, в противном случае вы увидите ERROR: cannot accumulate arrays of different dimensionality
.