2016-08-29 1 views
5

Ich möchte zwei Spalten mit einer Group-by-Abfrage verketten, die zu einem Array mit Klammern getrennt. Ich weiß, dass diese Frage mit this Frage in Verbindung steht, aber wie üblich ist mein Gebrauchfall ein wenig unterschiedlich.Wie zwei PostgreSQL-Spalten zu einem Array durch Klammern getrennt werden

Ein einfaches Beispiel (auch als SQL Fiddle). Derzeit meine Abfrage gibt die folgenden:

ID X Y 
3 0.5 2.71 
3 1.0 2.50 
3 1.5 2.33 
6 0.5 2.73 
6 1.5 2.77 

Aber wo würde Ich mag concatenate/aggregieren die X/Y Spalten folgendes zu erhalten:

ID XY 
3 [[0.5,2.71],[1.0,2.50],[1.5,2.33]] 
6 [[0.5,2.73],[1.5,2.77]] 

Zur Zeit habe ich versucht, um die Spalten zu verketten in man wie folgt vor:

SELECT "ID",concat_ws(', ',"X", "Y") as XY FROM Table1; 

Welche zurück:

ID xy 
3 0.5, 2.71 
3 1, 2.50 
3 1.5, 2.33 
6 0.5, 2.73 

Und verwendet array_agg():

SELECT "ID",array_to_string(array_agg("X"),',') AS XY 
FROM Table1 
GROUP BY "ID"; 

in Resultierende:

ID xy 
3 0.5,1,1.5 
6 0.5 

Ich glaube, ich bin immer näher, aber eine helfende Hand wäre wirklich zu schätzen.

Antwort

8

Erstellen eines Arrays aus den beiden Spalten, das Aggregat des Arrays:

select id, array_agg(array[x,y]) 
from the_table 
group by id; 

anzumerken, dass die Standard-Textdarstellung von Arrays geschweiften Klammern verwendet ({..}) keine eckigen Klammern ([..])

+0

Danke für Ihre schnelle Antwort, es funktioniert perfekt in postgresql (nicht in sqlfiddle) – Mattijn

+0

@ Mattijn: Ihre Version ist offensichtlich 9.5 oder später. sqlfiddle ist seit einiger Zeit bei 9.3 festgefahren. –

+2

Auch der Typ von x und y sollte gleich sein, d. H. Wenn x für Text steht, sollte y auch vom Typ text sein. Wenn nicht, müssen Sie den Typ case verwenden. (:: text) –

3

In Postgres 9.5 oder späterarray_agg() nimmt Arrays als Eingabe die einfache Syntax provided by @a_horse zu ermöglichen:

012.351.
SELECT id, array_agg(ARRAY[x, y]) AS xy 
FROM Table1 
GROUP BY id; 

In älteren Versionen ist dies noch nicht implementiert.

CREATE AGGREGATE array_agg_mult (anyarray) (
    SFUNC  = array_cat 
    , STYPE  = anyarray 
    , INITCOND = '{}' 
); 

Dann:

SELECT id, array_agg_mult(ARRAY[ARRAY[x,y]]) AS xy -- note the 2D array 
FROM Table1 
GROUP BY id; 

Details:

Oder Sie können verketten Sie können Ihre eigenen Aggregatfunktion (einmal) zu erreichen, das gleiche schaffen eine Zeichenkette:

SELECT id, '[[' || string_agg(concat_ws(',', x, y), '],[') || ']]' AS xy 
FROM Table1 
GROUP BY id; 

Erzeugt Ihr gewünschtes Ergebnis genau. Eine Zeichenfolge, kein Array.

+0

Danke, Ihre Antwort ist auch nützlich – Mattijn

Verwandte Themen