2010-10-29 12 views
22

così ho questa tabella:come fare array_agg() funzionare come group_concat() da MySQL

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

Poi alcuni valori:

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

voglio raggrupparli per id e concatenare il nome dell'immagine nell'ordine dato per grado. In MySQL Posso fare questo:

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

E l'output sarà:

 
1 aaa,bbb,ccc 
2 a,b,c 
C'è un modo per avere questo in PostgreSQL?

Se provo a utilizzare array_agg(), i nomi non verranno visualizzati nell'ordine corretto e apparentemente non sono riuscito a trovare un modo per ordinarli. (Stavo usando Postgres 8.4)

risposta

38

in PostgreSQL 8.4 non è possibile ordinare in modo esplicito array_agg ma si può lavorare intorno ad esso, ordinando le righe passati in al gruppo/aggregazione con una sottoquery:

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

In PostgreSQL 9.0 espressioni di aggregazione possono avere un ORDER BY clausola:

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

In realtà se posso aggiungere più righe alla mia tabella di prova questa soluzione non funziona. Sorprendentemente non funziona per me anche se carico la tabella nell'ordine corretto. Comunque la tua soluzione funziona con postgresql 8.4 solo se ordino la sottoquery sia per ID che per rank. strano se me lo chiedi – user491575

+0

La soluzione è un po 'hacky e sembra mostrare per te. Sospetto che ci sia una differenza nel piano di query che causa questo. Sono piuttosto curioso di sapere quale sia l'output di 'EXPLAIN' con il risultato negativo. In ogni caso, ho aggiornato la mia risposta con 'ORDER BY id, rank'. –

+0

Per prima cosa voglio ringraziarvi per la risposta. Risolve il problema che avevo. – user491575

Problemi correlati