问题
I have a table in PostgreSQL. I want to concatenate all the arrays(i.e. col) after grouping them by time. The arrays are of varying dimensions.
| time | col |
|------ |------------------ |
| 1 | {1,2} |
| 1 | {3,4,5,6} |
| 2 | {} |
| 2 | {7} |
| 2 | {8,9,10} |
| 3 | {11,12,13,14,15} |
The result should be as follows:
| time | col |
|------ |------------------ |
| 1 | {1,2,3,4,5,6} |
| 2 | {7,8,9,10} |
| 3 | {11,12,13,14,15} |
What I have come up with so far is as follows:
SELECT ARRAY(SELECT elem FROM tab, unnest(col) elem);
But this does not do the grouping. It just takes the entire table and concatenates it.
回答1:
To preserve the same dimension of you array you can't directly use array_agg(), so first we unnest your arrays and apply distinct to remove duplicates (1). In outer query this is the time to aggregate. To preserve values ordering include order by within aggregate function:
select time, array_agg(col order by col) as col
from (
select distinct time, unnest(col) as col
from yourtable
) t
group by time
order by time
(1) If you don't need duplicate removal just remove distinct word.
来源:https://stackoverflow.com/questions/51101596/how-to-group-by-and-concatenate-arrays-in-postgresql