【问题标题】:Generate a random number for each group and assign it to all rows in the group为每个组生成一个随机数并将其分配给组中的所有行
【发布时间】:2021-08-30 12:26:39
【问题描述】:

我有一张表格

ID     | DOC 
-------------
id1    | d1  
-------------
id1    | d2  
-------------
id2    | d3 
-------------
id2    | d4
-------------
id3    | d5
-------------

目标是按 ID 对表进行分组,对于每个组,从组数中选择一个随机数(在本例中,从 [1, 3] 中选择一个随机数)并将每个组的所有行分配一个数字。一种可能的配置是

ID     | DOC | GROUP_NUM
--------------------------
id1    | d1  | 2
--------------------------
id1    | d2  | 2
--------------------------
id2    | d3  | 1
--------------------------
id2    | d4  | 1
--------------------------
id3    | d5  | 3
--------------------------

我正在考虑使用 ROW_NUMBER() 和 PARTITION() 函数。考虑到 Bigquery 中的表很大,有什么更好的方法?

【问题讨论】:

标签: sql google-bigquery


【解决方案1】:

如果随机数可以连续,可以使用dense_rank()

select t.*, dense_rank() over (order by id) as group_num
from t;

或者更多的随机性:

select t.*,
       dense_rank() over (order by farm_fingerprint(cast(id as string)), id) as group_num
from t;

另外,id 的单独计算可能最简单:

select *
from t join
     (select id,
             dense_rank() over (order by rand()) as group_num
      from t
      group by id
     ) tt
     using (id)

【讨论】:

    【解决方案2】:

    考虑以下方法

    with array_with_random_nums as (
      select array_agg(num order by rand()) nums
      from (select count(distinct id) cnt from `project.dataset.table`), 
      unnest(generate_array(1,cnt)) num  
    )
    select t.*, 
      nums[offset(dense_rank() over(order by id) - 1)] group_num
    from `project.dataset.table` t, array_with_random_nums
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多