我有一个BigQuery表,它看起来像这样:
--------------------------------------------------------
| col1 | cols 2-10 | col 11 |
--------------------------------------------------------
| event1 | metatdata | [0,0,0,0,0,0,0...1, 30, 50, 43] |
--------------------------------------------------------
最后一列是表示事件数据的int64s数组(数组中的位置非常重要,以及任何前导零)。通常,ARRAY_AGG将在最后一列中聚合计数(这是所有这些数据的最终目标),但在我的示例中,数据实际上是运行长度编码(RLE),因此它可能如下所示:
[-20, 1, 4, 5, 10, 20]
[-10, 2, 4, 10, 3, 8]
任何负数都代表这个零数。
So -10,1是:0,0,0,0,0,0,0,0,1
我想出一种方法,在查询时用数组0的正确长度替换负数,这样我就可以将其输入ARRAY_AGG。
理想的解决方案将能够在查询时用适当的零数替换数组中的任意数量的负数,从而使聚合能够准确地计算。一个不太理想的解决方案将允许固定数量的替换(甚至1)。
因此,理想:-4,3,-2,1,-3,9 -> 0,0,0,3,0,0,1 0,1 0,0,0,9
到目前为止,我的尝试使用了UNNEST和IF语句,但我并没有取得很大进展。
谢谢你的意见。
发布于 2022-10-16 22:20:40
考虑以下方法
select
format('%t', col11) col11,
format('%t', encoded_col11) encoded_col11,
array(select cast(el as int64) from t.encoded_col11 as el)
from (
select col11, split((
select string_agg(if(num < 0,repeat('0', -num), '' || num), '' order by offset)
from t.col11 num with offset
), '') encoded_col11
from your_table t
) t
如果应用于问题中的样本数据,则输出为
https://stackoverflow.com/questions/74091003
复制相似问题