Sql 如何在BigQuery中将整数数组转换为一个热编码?

Sql 如何在BigQuery中将整数数组转换为一个热编码?,sql,google-bigquery,Sql,Google Bigquery,我有这样一个BQ表: ID index A [1, 3, 4] B [2] C [0, 3] D [2, 3] 我希望得到一个新表,其中包含一个固定长度的热编码索引列: ID index A [0, 1, 0, 1, 1] B [0, 0, 1, 0, 0] C [1, 0, 0, 1, 0] D [0, 0, 1, 1, 0] 这里有一个类似的问题:,但它转换成多个列而不是单个列。使用下面的 #standardSQL with temp as

我有这样一个BQ表:

ID  index
A   [1, 3, 4]   
B   [2]
C   [0, 3]
D   [2, 3]
我希望得到一个新表,其中包含一个固定长度的热编码索引列:

ID  index
A   [0, 1, 0, 1, 1]   
B   [0, 0, 1, 0, 0]
C   [1, 0, 0, 1, 0]
D   [0, 0, 1, 1, 0]
这里有一个类似的问题:,但它转换成多个列而不是单个列。

使用下面的

#standardSQL
with temp as (
  select i from (
    select max(i) as max_index
    from `project.dataset.table` t,
    t.index i
  ), unnest(generate_array(0, max_index)) i
)
select id,  
  ( select array_agg(if(i = i1, 1, 0) order by i)
    from temp 
    left join t.index as i1
    on i = i1
  ) index
from `project.dataset.table` t     
如果以上内容适用于您问题中的样本数据

with `project.dataset.table` as (
  select 'A' id, [1, 3, 4] index union all
  select 'B', [2] union all
  select 'C', [0, 3] union all
  select 'D', [2, 3] 
)       
  • 输出为

如您所见,它生成一列整数数组
如果您希望列为字符串类型,请使用下面的内容,而不是
array\u agg

string_agg(if(i = i1, '1', '0') order by i)    
在这种情况下,输出将(非常相似)