Функция NTH действительно полезна для извлечения вложенных элементов массива в BQ, но ее полезность для данной таблицы зависит от вложенного массива каждой строки, содержащего одинаковое количество элементов и в том же порядке. Если у меня есть вложенный массив из столбцов 2+, где один столбец является именем / идентификатором переменной, а разные экземпляры массива в разных строках имеют непоследовательное именование и / или упорядочение, существует ли элегантный способ извлечения / поворота переменной на основе Имя переменной / ID?
Например, если в row1 есть массив customDimensions:
index value
4 aaa
23 bbb
70 ccc
и row2 имеет массив customDimensions:
index value
4 ddd
70 eee
Я бы хотел запустить что-то вроде
SELECT
NTHLOOKUP(70, customdims.index, customdims.value) as val70,
NTHLOOKUP(4, customdims.index, customdims.value) as val4,
NTHLOOKUP(23, customdims.index, customdims.value) as val23
from my_table;
И получите:
val70 val4 val23
ccc aaa bbb
eee ddd (null)
Мне удалось получить такой результат, выполнив подзапрос для каждого желаемого значения индекса, развернув массив в каждом и отфильтровав WHERE index = (value)
, но это становится действительно уродливым, когда переменные накапливаются. Есть ли альтернатива?
РЕДАКТИРОВАТЬ: Основываясь на ответе Михаила ниже (спасибо!), Я смог написать свой запрос более элегантно. Не так гладко, как NTHLOOKUP, но я возьму это:
select id,
max(case when index = 41 then value[OFFSET(0)] else '' end) as val41,
max(case when index = 59 then value[OFFSET(0)] else '' end) as val59
from
(select
concat(array1.thing1, array1.thing2) as id,
cd.index,
ARRAY_AGG(distinct cd.value) as value
FROM my_table g
,unnest(array1) as array1
,unnest(array1.customDimensions) as cd
where index in (41,59)
group by 1,2
order by 1,2
) x
group by 1
order by 1