2010-10-29 20 views
22

así que tengo esta tabla:cómo hacer ARRAY_AGG() funcionar como GROUP_CONCAT() de MySQL

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

A continuación, algunos valores:

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

Quiero agruparlos por ello y concatenar la nombre de la imagen en el orden dado por el rango. En MySQL que pueda hacer esto:

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

Y la salida sería:

 
1 aaa,bbb,ccc 
2 a,b,c 
¿Hay alguna manera de que pueda tener esto en PostgreSQL?

Si trato de usar array_agg() los nombres no se mostrarán en el orden correcto y aparentemente no pude encontrar la manera de ordenarlos. (Yo estaba usando PostgreSQL 8.4)

Respuesta

38

En PostgreSQL 8.4 no se puede pedir explícitamente array_agg pero se puede trabajar alrededor de ella, ordenando las filas pasaron a al grupo/agregado con una subconsulta:

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

En PostgreSQL 9.0 expresiones agregados pueden tener una cláusula de ORDER BY:

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

en realidad si añado más filas a mi tabla de prueba esta solución no funciona. Sorprendentemente, no funciona para mí, incluso si cargué la tabla en el orden correcto. Sin embargo, su solución funciona en postgresql 8.4 solo si clasifico la subconsulta tanto por id como por rango. raro si me preguntas – user491575

+0

La solución alternativa es un poco hacky y parece mostrar para usted. Sospecho que hay una diferencia de plan de consulta causando esto. Tengo cierta curiosidad sobre cuál es el resultado de 'EXPLAIN' con el mal resultado. En cualquier caso, he actualizado mi respuesta con 'ORDER BY id, rank'. –

+0

Primero quiero agradecerle la respuesta. Resuelve el problema que tuve. – user491575