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)
从行列表
加入项目列表
使用(项目)
哪里是真的
可能有用谢谢你的建议,我编辑了这个问题来解释为什么我认为这不足以解决我的问题。可能有用谢谢你的建议,我编辑了这个问题来解释为什么我认为这不足以解决我的问题。