Как группировать и объединять массивы в PostgreSQL - PullRequest
0 голосов
/ 29 июня 2018

У меня есть таблица в PostgreSQL. Я хочу объединить все массивы (т.е. col) после группировки их по time. Массивы имеют разные размеры.

| time  | col               |
|------ |------------------ |
| 1     | {1,2}             |
| 1     | {3,4,5,6}         |
| 2     | {}                |
| 2     | {7}               |
| 2     | {8,9,10}          |
| 3     | {11,12,13,14,15}  |

Результат должен быть следующим:

| time  | col               |
|------ |------------------ |
| 1     | {1,2,3,4,5,6}     |
| 2     | {7,8,9,10}        |
| 3     | {11,12,13,14,15}  |

То, что я до сих пор придумал, таково:

SELECT ARRAY(SELECT elem FROM tab, unnest(col) elem);

Но это не делает группировку. Он просто берет всю таблицу и объединяет ее.

1 Ответ

0 голосов
/ 29 июня 2018

Чтобы сохранить тот же размер вашего массива, вы не можете напрямую использовать array_agg(), поэтому сначала мы unnest используем ваши массивы и применяем distinct для удаления дубликатов (1). Во внешнем запросе это время для агрегирования. Чтобы сохранить порядок значений, включите в статистическую функцию order by:

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) Если вам не нужно удалять дубликаты, просто удалите distinct word.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...