Random BigQuery:为每个组采样不同数量的行

Random BigQuery:为每个组采样不同数量的行,random,google-bigquery,Random,Google Bigquery,我有两张桌子。其中有一个项的列表s,每个项都有一个编号n item | n -------- a | 1 b | 2 c | 3 第二个是包含项、uid和其他行的行列表 item | uid | data ------------------ a | x | foo a | x | baz a | x | bar a | z | arm a | z | leg b | x | eye b | x | eye

我有两张桌子。其中有一个
项的列表
s,每个项都有一个编号
n

item | n
--------
a    | 1
b    | 2
c    | 3
第二个是包含
uid
和其他行的行列表

item | uid | data
------------------
a    | x   | foo
a    | x   | baz
a    | x   | bar
a    | z   | arm
a    | z   | leg
b    | x   | eye
b    | x   | eye
b    | x   | eye
b    | x   | eye
b    | z   | tap
c    | y   | tip
c    | z   | top

我想对每个
(item,uid)
对,
n
行进行采样(任意,如果这是一致随机的,则更好,但不必如此)。在上面的示例中,我希望为项目
a
每个用户最多保留一行,为项目
b
每个用户最多保留两行,为项目
c
每个用户最多保留三行:

item | uid | data
------------------
a    | x   | baz
a    | z   | arm
b    | x   | eye
b    | x   | eye
b    | z   | tap
c    | y   | tip
c    | z   | top
ARRAY\u AGG
LIMIT n
不起作用有两个原因:首先,我怀疑如果
n
可能很大(大约100000),这将无法扩展。第二个更基本的问题是
n

而且似乎也不能解决我的问题,因为它是针对每个表的,并且只支持对固定百分比的行进行采样,而不是固定数量的行


还有其他选择吗?

考虑以下解决方案

select * except(n)
from rows_list
join items_list 
using(item)
where true
qualify row_number() over win <= n
window win as (partition by item, uid order by rand())    
选择*except(n)
从行列表
加入项目列表
使用(项目)
哪里是真的

将行数()限定为赢考虑以下解决方案

select * except(n)
from rows_list
join items_list 
using(item)
where true
qualify row_number() over win <= n
window win as (partition by item, uid order by rand())    
选择*except(n)
从行列表
加入项目列表
使用(项目)
哪里是真的

可能有用谢谢你的建议,我编辑了这个问题来解释为什么我认为这不足以解决我的问题。可能有用谢谢你的建议,我编辑了这个问题来解释为什么我认为这不足以解决我的问题。