2010-05-17 7 views
3

Possible en double:
How to concatenate strings of a string field in a PostgreSQL ‘group by’ query?sql: fonctions d'agrégation et join/concaténation

(j'utilise postgres)

Y a-t-il des fonctions d'agrégation qui travaillent sur les chaînes ?

Je veux écrire une requête le long des lignes de

select table1.name, join(' - ', unique(table2.horse)) as all_horses 
from table1 inner join table2 on table1.id = table2.fk 
group by table1.name 

Compte tenu de ces 2 tables:

| table1   |    | table2     | 
| id (pk) | name |    | id (pk) | horse | fk | 
+---------+-------+    +---------+---------+-------+ 
|  1 | john |    |  1 | redrum |  1 | 
|  2 | frank |    |  2 | chaser |  1 | 
            |  3 | cigar |  2 | 

La requête doit retourner:

| name | all_horses  | 
+--------+-------------------+ 
| john | redrum - chaser | 
| frank | cigar   | 

Do fonctions le long des des lignes de join et unique existent dans tous les DB pour les chaînes?

Répondre

10
select table1.name, 
    array_to_string(array_agg(distinct table2.horse), ' - ') as all_horses 
from table1 inner join table2 on table1.id = table2.fk 
group by table1.name 
+0

hmm ne semblent pas avoir les fonctions définies - peut vous aider à me fermer la question car il est un double de 43870? – EoghanM

+0

essayez de mettre à niveau vers 8.4, array_agg est intégré. En ce qui concerne la clôture de la question, il faut 5 fermer, à partir de maintenant seulement 1 fermé votre question. vous pouvez supprimer votre propre question –

4

Il y a une requête string_agg dans PostreSQL 9. J'ai une table des régions et une table des départements, où il y a plusieurs départements dans une région (par exemple France). Mon exemple de requête est:

select r.name, string_agg(d.name, ',') 
from regions r 
join departments d on d.region = r.code 
group by r.name 
order by r.name; 

Cela me donne des lignes comme

Picardie Aisne,Oise,Somme 

Les choses deviennent un peu en désordre si vous blême pour changer l'ordre de la chaîne agrégée. Cela fonctionne, mais j'ai une aversion pathologique d'une requête avec distincte:

select distinct r.name as region, string_agg(d.name, ',') over w as departments 
from regions r 
join departments d on d.region = r.code 
window w as (partition by r.name order by d.name desc 
    rows between unbounded preceding and unbounded following)