我有一个数据集,我想将其拆分为两组,拆分为70/30。我也希望拆分是随机的,但1个ID下的所有项目都必须在拆分的同一组中,无论是70还是30。我想知道使用SQL(红移(做这件事的最佳方法是什么。我试过使用NTILE,但它不太开放。我尝试的是
with a as (select *,ntile(10) over (order by ID) tile
from table)
select *, case when tile <= 7 then 1 else 0 as bucket
from a
谢谢。
示例数据:
用户 | ID | 第3列 |
---|---|---|
123214123 | abc | Y|
544354342 | abc | N |
43241231 | 定义 | Y|
231213123 | def | Y |
123123123 | abc | Y
考虑到您的限制,您不能使用ntile()
,因为它专注于使bucket大小合适。相反,您可以使用rank()
:
select t.*,
(case when seqnum < cnt * 0.7 then 1 else 0 end) as bucket
from (select t.*,
rank() over (order by md5(id), id) as seqnum,
count(*) over () as cnt
from t
) t;
注意,这任意地使用md5()
来向每个id
分配随机值。这是可重复的。获得不同桶的一种简单方法是";盐";带有另一个字符串的值。