我有一个像这样的配置表:
id | value_array
1 | [1, 2, 3, 4]
2 | [1, 2, 1, 1]
我希望通过数组的总和对value_array进行归一化,以便获得以下结果:
id | value_array
1 | [0.1, 0.2, 0.3, 0.4]
2 | [0.2, 0.4, 0.2, 0.2]
我不知道如何编写SQL来实现目标。
分解数组,计算sum(),除以每个元素,然后再次收集数组。像这样(未经测试):
with your_data as (--use your table instead of this
select stack (2,
1,array(1, 2, 3, 4),
2,array(1, 2, 1, 1)
) as (id,value_array)
)
select id, collect_list(v/array_sum) as result_array
from
(
select id, sum(v) over(partition by id) as array_sum, v, pos
from your_data s
lateral view posexplode(s.value_array) a as pos, v
distribute by id sort by pos --preserve original array order
)s
group by id
;