2010-10-29 21 views
22

So habe ich diese Tabelle:wie array_agg() funktioniert wie Group_concat() von mySQL machen

create table test (
    id integer, 
    rank integer, 
    image varchar(30) 
); 

Dann sind einige Werte:

id | rank | image 
---+------+------- 
1 | 2 | bbb 
1 | 3 | ccc 
1 | 1 | aaa 
2 | 3 | c 
2 | 1 | a 
2 | 2 | b 

Ich möchte, dass sie von ID-Gruppe und verketten die Bildname in der Reihenfolge nach Rang. In mySQL kann ich dies tun:

select id, 
     group_concat(image order by rank asc separator ',') 
    from test 
group by id; 

Und würde der Ausgang sein:

 
1 aaa,bbb,ccc 
2 a,b,c 
Gibt es eine Weise, die ich dies in postgresql haben kann?

Wenn ich versuche, array_agg() zu verwenden, werden die Namen nicht in der richtigen Reihenfolge angezeigt und anscheinend war ich nicht in der Lage, eine Möglichkeit zu finden, sie zu sortieren. (I wurde mit Postgres 8,4)

Antwort

38

In PostgreSQL 8.4 Sie können nicht explizit array_agg bestellen, aber Sie können in einer Unterabfrage in der Gruppe/Aggregat geführt durch Ordnen der Reihen um es:

SELECT id, array_to_string(array_agg(image), ',') 
FROM (SELECT * FROM test ORDER BY id, rank) x 
GROUP BY id; 

In PostgreSQL 9.0 Aggregatausdrücke kann eine ORDER BY Klausel:

SELECT id, array_to_string(array_agg(image ORDER BY rank), ',') 
FROM test 
GROUP BY id; 
+0

Eigentlich, wenn ich diese Lösung funktioniert nicht mehr Zeilen zu meiner Test-Tabelle hinzufügen. Überraschenderweise funktioniert das nicht, auch wenn ich den Tisch in der richtigen Reihenfolge lade. Ihre Lösung funktioniert jedoch nur dann in PostgreSQL 8.4, wenn ich die Unterabfrage sowohl nach ID als auch nach Rang sortiert habe. komisch, wenn Sie mich fragen – user491575

+0

Der Workaround ist ein bisschen hacky und es scheint für Sie zu zeigen. Ich vermute, dass es einen Abfrageplanunterschied gibt, der dies verursacht. Ich bin etwas neugierig, was Ihre EXPLAIN-Ausgabe mit dem schlechten Ergebnis ist. In jedem Fall habe ich meine Antwort mit 'ORDER BY ID, Rang 'aktualisiert. –

+0

Zuerst möchte ich Ihnen für die Antwort danken. Es löst das Problem, das ich hatte. – user491575