如何在bigquery中使用array_agg()函数为值分配唯一键

时间:2019-05-03 11:23:06

标签: sql google-bigquery

我正在尝试使用row_number将键分配给bigquery中的每个不同值。但这给了资源错误。那么我可以使用array_aggegate函数实现相同的功能吗?

代码:

select a.values 
    , a.type
    , max_key + row_number() over(order BY a.values) key
    , a.event_date
    from gaid_raw a
    LEFT JOIN  existing_key_table e
    on  e.type = a.type
    and e.values = a.values
    left join (
      select type, coalesce(max(key),0) max_key from existing_key_table group by 1
    ) e1
    on e1.type = a.type
    where e.key is null

1 个答案:

答案 0 :(得分:1)

我不确定这是否可以解决您的问题,但是我认为这是您想要的逻辑:

select gr.values, gr.type
       coalesce(max_key, 0) + row_number() over (partition by gr.type order by gr.values) as key,
       gr.event_date
from gaid_raw gr left join
     (select type, max(key) as max_key
      from existing_key_table
      group by 1
     ) e
     on e.type = gr.type
where not exists (select 1
                  from existing_key_table e
                  where e.type = gr.type and e.values = gr.values
                 );

对于无法识别的类型,您需要在外部coalesce()中使用select,而不是子查询。

您似乎还想根据类型分配顺序号。

如果仍然遇到资源错误,有一种方法可以解决此问题,但是还需要有关数据的更多信息。但是,我过去曾为此类键使用随机值-假设不需要排序。发生碰撞的机会很小,因此它已经可以处理相当大的数据。

现在,我将GENERATE_UUID()用作唯一ID。