#sql #presto
Вопрос:
Я ни за что на свете не могу понять, как это сделать в престо. После запроса у меня есть два агрегированных массива a и b. Я хотел бы выяснить, как превратить каждый индекс массива в карту со статическими метками для каждого значения в a и b.
См., например, ниже. Я поиграл со всеми различными функциями отображения массивов в документации Presto, но, похоже, не могу этого понять. Есть какие-нибудь мысли?
Примечание: Длина a и b всегда будет одинаковой, но может варьироваться от 1 до 10
Ввод
select
array_agg('a','b','c') as a,
array_agg(1,2,3) as b
from etc...
который превращается в
a | b |
---|---|
[‘a’,’b’,’c’] | [1,2,3] |
Затем, после некоторой трансформации…
Желаемый Результат:
{
'static_label_char' -> 'a',
'static_label_num' -> 1
},
{
'static_label_char' -> 'b',
'static_label_num' -> 2
},
{
'static_label_char' -> 'c',
'static_label_num' -> 3
}
Ответ №1:
Не уверен, что вы можете создать карту, содержащую различные типы в качестве значений, но вы можете заархивировать массивы и преобразовать результат в строки с именованными полями:
SELECT transform(
zip(a, b),
r -> cast(r AS ROW(static_label_char CHAR, static_label_num SMALLINT)))
FROM
(SELECT ARRAY['a','b','c'] AS a, ARRAY[1,2,3] AS b)
Выход:
_col0 |
---|
[{static_label_char=a, static_label_num=1}, {static_label_char=b, static_label_num=2}, {static_label_char=c, static_label_num=3}] |
А затем вы можете использовать точечную нотацию для доступа к именованному полю. Например, с unnest
:
SELECT r.static_label_char, r.static_label_num
FROM
(SELECT transform( zip(a, b),
r -> cast(r AS ROW(static_label_char CHAR, static_label_num SMALLINT))) AS rows
FROM
(SELECT ARRAY['a','b','c'] AS a, ARRAY[1,2,3] AS b) )
CROSS JOIN UNNEST(rows) AS t (r);
Выход:
static_label_char | static_label_num |
---|---|
a | 1 |
b | 2 |
c | 3 |
Комментарии:
1. Хм, ладно, я поиграю с ним и посмотрю, что смогу найти. Спасибо! обновится, если я найду ответ