У меня есть таблица, и я хотел бы получить одну строку на идентификатор с объединенными значениями поля.
В моей таблице, например, у меня есть это:
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 или другой способ сделать это?
sql
postgresql
group-concat
string-aggregation
TwixxyKit
источник
источник
Ответы:
Вероятно, это хорошая отправная точка (только версия 8.4+):
array_agg возвращает массив, но вы можете CAST его в текст и редактировать по мере необходимости (см. пояснения ниже).
До версии 8.4 вы должны определить ее самостоятельно перед использованием:
(перефразировано из документации PostgreSQL)
Разъяснения:
источник
С 9.0 это еще проще:
источник
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, ',')
TEXT
преобразовать значение столбца, если оно не является строковым значением (т. Е.uuid
). Это будет выглядетьstring_agg(some_column::text, ',')
Будет так же хорошо.
источник
Попробуйте вот так:
источник
и версия для работы с типом массива :
источник
character varying(5)[]
. Кроме того, я проверил, что для моей цели - нужно гнестить, иначе вы увидитеERROR: cannot accumulate arrays of different dimensionality
.Мое предложение в postgresql
источник
ORDER BY
во внутреннем запросе? В любом случае заказ не потеряется?Надеюсь, что ниже Oracle запрос будет работать.
источник