Элементное добавление массива в PostgreSQL - PullRequest
0 голосов
/ 02 июля 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     | {4,6,5,6}         |
| 2     | {15,9,10}         |
| 3     | {11,12,13,14,15}  |

Я нашел этот ответ , который делает нечто подобное для фиксированного размера 3 элементов. Но это не работает для разных размеров.

DBFiddle например.

1 Ответ

0 голосов
/ 02 июля 2018

Вы можете использовать unnest с порядковым номером:

SELECT time, array_agg(elem order by nr)
FROM (SELECT time, nr, SUM(elem) AS elem
      FROM tab,unnest(col) WITH ORDINALITY a(elem, nr)
      GROUP BY time,nr) s
GROUP BY time;

Демоверсия DBFiddle

Выход:

┌──────┬──────────────────┐
│ time │    array_agg     │
├──────┼──────────────────┤
│    1 │ {4,6,5,6}        │
│    2 │ {15,9,10}        │
│    3 │ {11,12,13,14,15} │
└──────┴──────────────────┘
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...