Объединить строки с одинаковыми в таблице postgresql - PullRequest
1 голос
/ 20 марта 2020

У меня есть следующая таблица в postgresql:

id | grade | comment
--------------------
01 | A     | Good
01 | B     | OK
01 | C     | BAD
02 | A     | Good
02 | E     | Very BAD
02 | D     | BAD

Я хочу получить записи в следующем формате

id | grade1 | grade2 | grade3 | comment1 | comment2 | comment3  
--------------------------------------------------------------
01 | A      | B      | C      | Good     | OK       | BAD
02 | A      | E      | D      | Good     | Very BAD | BAD

Может кто-нибудь помочь?

Ответы [ 2 ]

1 голос
/ 20 марта 2020

SQL таблицы представляют неупорядоченные наборы. Ваши результаты, кажется, подразумевают, что результаты в некотором порядке. Ни один столбец не содержит такой порядок.

Один из способов - просто поместить значения в массивы:

select id, array_agg(grade order by <ordering col>) as grades,
       array_agg(comment order by ?) as comment
from t
group by id;

. Вы можете расширить это до нескольких столбцов:

select id,
       (array_agg(grade order by <ordering col>))[1] as grade_1,
       (array_agg(grade order by <ordering col>))[2] as grade_2,
       (array_agg(grade order by <ordering col>))[3] as grade_3
       (array_agg(comment order by <ordering col>)[1] as comment_1,
       (array_agg(comment order by <ordering col>)[2] as comment_2,
       (array_agg(comment order by <ordering col>)[3] as comment_3
from t
group by id;
1 голос
/ 20 марта 2020

Можно использовать row_number() и условное агрегирование:

select 
    id,
    max(grade)   filter(where rn = 1) grade1,
    max(grade)   filter(where rn = 2) grade2,
    max(grade)   filter(where rn = 3) grade3,
    max(comment) filter(where rn = 1) comment1,
    max(comment) filter(where rn = 2) comment2,
    max(comment) filter(where rn = 3) comment3
from (
    select t.*, row_number() over(partition by id order by grade) rn
    from mytable t
) t
group by id
...