2016-07-22 5 views
0

Я пытаюсь объединить несколько строк с одинаковыми идентификаторами в один.Слияние нескольких строк в один, используя Postgresql

Моя сырым таблица выглядит следующим образом:

ID | person_id | eur_amount 
1  3   200 
1  2   100 
2  3   80 
2  2   100 

Вывод должен выглядеть следующим образом:

ID | person_1 | eur_amount_1 | person_2 | eur_amount_2 | 
1  3   200   2   100 
2  3   80   2   100 

Максимальное количество человек такой же. Я уже пытался решить его с помощью нескольких операторов JOIN и функции crosstab(), как указано здесь PostgreSQL Crosstab Query.

Но я не мог найти решение для этого - кто-нибудь знает хороший способ добиться желаемого результата?

Заранее благодарен!

+1

Мой первый вопрос: почему вы хотите это сделать? Но я отвлекся ... личный_ид уже известен заранее (IE в запросе только когда-либо ищет personID 2 и 3), а у двух человек верхний предел столбцов или у вас будет больше? Похоже, вы пытаетесь заставить SQL сделать что-то, о чем должен беспокоиться отчет GUI. Должен также спросить, что определяет, какое значение переходит в person_1 vs person_2, это только порядок строк? – Twelfth

+0

'select id, array_agg (строка (person_id, eur_amount) order by person_id desc) как perdata из группы my_raw_rable по id;' – Abelisto

ответ

0

Вы можете сделать это с помощью перекрестной закладки или условной агрегации. Но вам нужно идентифицировать строки, используя row_number(). Например:

select id, 
     max(case when seqnum = 1 then person_id end) as person_id_1, 
     max(case when seqnum = 1 then eur_amount end) as eur_amount_1, 
     max(case when seqnum = 2 then person_id end) as person_id_2, 
     max(case when seqnum = 2 then eur_amount end) as eur_amount_2 
from (select t.*, 
      row_number() over (partition by id order by id) as seqnum 
     from t 
    ) t 
group by id; 
Смежные вопросы