Разделение массива на столбцы в Афине / Престо - PullRequest
0 голосов
/ 12 декабря 2018

Я чувствую, что это должно быть просто, но я изо всех сил пытался найти правильную терминологию, пожалуйста, потерпите меня.

У меня есть два столбца, timestamp и voltages, который является массивом

Если я сделаю простое

SELECT timestamp, voltages FROM table

Тогда я получу результат:

|timestamp | voltages | |1544435470 |3.7352,3.749,3.7433,3.7533| |1544435477 |3.7352,3.751,3.7452,3.7533| |1544435484 |3.7371,3.749,3.7433,3.7533| |1544435490 |3.7352,3.749,3.7452,3.7533| |1544435497 |3.7352,3.751,3.7452,3.7533| |1544435504 |3.7352,3.749,3.7452,3.7533|

Но я хочу разделить массив voltages, чтобы каждый элемент в его массиве был своим собственным столбцом.

|timestamp | v1 | v2 | v3 | v4 | |1544435470 |3.7352 |3.749 |3.7433 |3.7533| |1544435477 |3.7352 |3.751 |3.7452 |3.7533| |1544435484 |3.7371 |3.749 |3.7433 |3.7533| |1544435490 |3.7352 |3.749 |3.7452 |3.7533| |1544435497 |3.7352 |3.751 |3.7452 |3.7533| |1544435504 |3.7352 |3.749 |3.7452 |3.7533|

Я знаю, что могу сделать это с:

SELECT timestamp, voltages[1] as v1, voltages[2] as v2 FROM table

Но мне нужно было бы делать это программно, а не перечислять ихиз.

Я что-то упускаю из виду?

1 Ответ

0 голосов
/ 13 декабря 2018

Это должно служить вашей цели, если у вас есть массивы фиксированной длины.
Сначала нужно разбить каждый элемент массива на его собственную строку.Вы можете сделать это с помощью оператора UNNEST следующим образом:

SELECT timestamp, volt
FROM table
CROSS JOIN UNNEST(voltages) AS t(volt)

Используя результирующую таблицу, вы можете преобразовать несколько строк с одной и той же отметкой времени в несколько столбцов, обратившись к ответу Гордона Линоффа здесь

...