I’m sure the title is not clear enough, couldn’t find a better way to explain what I need.
I’m using PostGreSQL 11.4
i’ll minify the problem i’m having to show the actual issue.
I have a query that returns the following:
x
id | time | direction | name
------------------------------
1 0 1 foo1
1 0 2 foo2
1 1 1 foo3
1 1 2 foo4
2 2 1 foo5
2 2 2 foo6
3 3 2 foo7
what I would like to do is to group by id, time
and to add two new columns: name_direction1
and name_direction2
so the result table would be:
id | time | name_direction1 | name_direction2
1 0 foo1 foo2
1 1 foo3 foo4
2 2 foo5 foo6
3 3 foo7
as far as I know with group by
I can’t really reach each one of the rows. in my case I need to combine two rows when both directions are presented.
any ideas how to achieve this?
thank you!
Advertisement
Answer
With conditional aggregation:
select
id, time,
max(case direction when 1 then name end) name_direction_1,
max(case direction when 2 then name end) name_direction_2
from tablename
group by id, time
See the demo.
Results:
| id | time | name_direction_1 | name_direction_2 |
| --- | ---- | ---------------- | ---------------- |
| 1 | 0 | foo1 | foo2 |
| 1 | 1 | foo3 | foo4 |
| 2 | 2 | foo5 | foo6 |
| 3 | 3 | | foo7 |