2010-05-17 3 views
3

Можно создать дубликат:
How to concatenate strings of a string field in a PostgreSQL ‘group by’ query?SQL: агрегатные функции и строка присоединиться/конкатенации

(я использую Postgres)

Есть ли агрегатные функции, которые работают со строками ?

Я хочу написать запрос по линиям

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

Учитывая эти 2 таблицы:

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

Запрос должен возвращать:

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

Do функции, которые вместе с строки join и unique существуют в любых БД для строк?

ответ

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

хмм, похоже, не имеет те функции, определенный - вы можете мне помочь закрыть вопрос, как это дубликат 43870? – EoghanM

+0

попробуйте обновить до 8.4, массив array_agg встроен. что касается закрытия вопроса, ему нужно 5 закрыть, на данный момент только 1 закрыл ваш вопрос. вы можете удалить свой собственный вопрос –

4

Существует string_agg запрос в PostreSQL 9. У меня есть таблица областей и таблицы отделов, где есть несколько отделений в регионе (например, Франция). Мой пример запроса:

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; 

Это дает мне строки, как

Picardie Aisne,Oise,Somme 

Вещи получить немного грязный, если вы тусклый изменить порядок агрегированного строки. Это работает, но у меня есть патологическая нелюбовь любого запроса с отчетливым:

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) 
Смежные вопросы