Mam tabelę i chciałbym pobrać jeden wiersz na identyfikator z połączonymi wartościami pól.
Na przykład w mojej tabeli mam to:
TM67 | 4 | 32556
TM67 | 9 | 98200
TM67 | 72 | 22300
TM99 | 2 | 23009
TM99 | 3 | 11200
I chciałbym wyprowadzić:
TM67 | 4,9,72 | 32556,98200,22300
TM99 | 2,3 | 23009,11200
W MySQL mogłem używać funkcji agregującej GROUP_CONCAT
, ale wydaje się, że to tutaj nie działa ... Czy istnieje odpowiednik PostgreSQL, czy inny sposób na osiągnięcie tego?
sql
postgresql
group-concat
string-aggregation
TwixxyKit
źródło
źródło
Odpowiedzi:
Jest to prawdopodobnie dobry punkt wyjścia (tylko wersja 8.4+):
array_agg zwraca tablicę, ale możesz CAST ją przesłać do tekstu i edytować w razie potrzeby (patrz wyjaśnienia poniżej).
Przed wersją 8.4 musisz to zdefiniować samodzielnie przed użyciem:
(parafrazowany z dokumentacji PostgreSQL)
Wyjaśnienia:
źródło
Od wersji 9.0 jest to jeszcze łatwiejsze:
źródło
array_agg
) np.string_agg(some_column, ',' ORDER BY some_column)
Lub nawetstring_agg(surname || ', ' || forename, '; ' ORDER BY surname, forename)
distinct
działa z string_agg, więc można go używaćstring_agg(distinct some_solumn, ',')
TEXT
jeśli jest to wartość nie łańcuchowa (tj.uuid
). To by wyglądało jakstring_agg(some_column::text, ',')
Zrobi tak samo.
źródło
Spróbuj tak:
źródło
oraz wersja do pracy z typem tablicy :
źródło
character varying(5)[]
. Sprawdziłem też, że do moich celów - potrzebna jest nieuczciwość, inaczej zobaczyszERROR: cannot accumulate arrays of different dimensionality
.Moja sugestia w postgresql
źródło
ORDER BY
w wewnętrznym zapytaniu? Czy mimo to zamówienie się nie zgubi?Nadzieja poniżej zapytania Oracle będzie działać.
źródło