我有一个表,其中包含用户日期级别的数据,即
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%的行。