sql - 为每个组生成一个随机数并将其分配给组中的所有行
问题描述
我有一张表格
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 中的表很大,有什么更好的方法呢?
解决方案
如果随机数可以是连续的,您可以使用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)
推荐阅读
- python - 提高余弦相似度的效率
- ios - 如何在按钮操作调用中强制重绘快速 ui 视图
- reactjs - REDUX:刷新页面后我的数据是否可能没有被删除?
- servicestack - AppSelfHoseBase 在 .net 5 中启动时生成错误
- c# - 如何使用 Xamarin 表单和 C# 将 Html 数据从网站保存到文本文件
- python - 当使用 DownloaderMiddleware 处理第一个请求时,Scrapy 似乎正在对第一个请求进行重复数据删除
- docker - 如何在 docker-compose 中扩展两个服务(一个是网络)并保持它们相互连接到彼此的 network_mode?
- java - 在java中删除数据文件
- python - 神经网络稀疏行作为输入
- javascript - 无法读取“null”的属性(读取 appendChild)