首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有游程编码数组的Bigquery中的数组聚合

具有游程编码数组的Bigquery中的数组聚合
EN

Stack Overflow用户
提问于 2022-10-16 22:08:18
回答 1查看 44关注 0票数 0

我有一个BigQuery表,它看起来像这样:

代码语言:javascript
运行
复制
--------------------------------------------------------
|  col1  | cols 2-10 |              col 11             |
--------------------------------------------------------
| event1 | metatdata | [0,0,0,0,0,0,0...1, 30, 50, 43] |
--------------------------------------------------------

最后一列是表示事件数据的int64s数组(数组中的位置非常重要,以及任何前导零)。通常,ARRAY_AGG将在最后一列中聚合计数(这是所有这些数据的最终目标),但在我的示例中,数据实际上是运行长度编码(RLE),因此它可能如下所示:

代码语言:javascript
运行
复制
[-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语句,但我并没有取得很大进展。

谢谢你的意见。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-16 22:20:40

考虑以下方法

代码语言:javascript
运行
复制
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   

如果应用于问题中的样本数据,则输出为

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74091003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档