如何挑选随机样本,同时确保数据在主键级别是唯一的



我有一个表,其中包含用户日期级别的数据,即

userID date        eventID
A      2021-06-01   123
B      2021-06-01   342
C      2021-06-01   23487
A      2021-06-01   234221
D      2021-06-01   34245
A      2021-06-01   09834

我想随机选择20%的行,因此使用

select *
from table
where rand() <= (1/5)

输出具有输入表中20%的行,但也有一些用户在重复。我想确保每个用户只有1行,对于同一天有多个条目的用户,选择是随机的。

您可以使用row_number()进行以下操作:

select t.* except (seqnum)
from (select t.*,
row_number() over (partition by userid order by rand()) as seqnum
from t
) t
where 1=1
qualify row_number() over (order by seqnum order by rand()) < 0.2 * count(*) over ();

这是在干什么?这是对每个用户的行进行随机化,任意为它们分配一个序列号。

然后,它通过序列号分配一个新的排序。因此;第一个";每个用户的行将首先被提取,依此类推。这平衡了每个用户的行号。

qualify()然后选择20%的行。

最新更新