数据集拆分 70-30 SQL

dataset split 70-30 SQL

我有一个数据集,我想将其分成 2 组,拆分为 70/30。我也希望拆分是随机的,但 1 个 ID 下的所有项目都必须在拆分的同一组中,无论是在 70 还是 30 侧。想知道使用 SQL (redshift) 执行此操作的最佳方法是什么。我尝试过使用 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 

谢谢。

示例数据:

User ID column 3
123214123 abc Y
544354342 abc N
43241231 def Y
231213123 def Y
123123123 abc Y

鉴于您的限制,您不能使用 ntile(),因为它着重于使存储桶大小合适。相反,您可以使用 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分配一个随机值。这是可重复的。获得不同桶的一种简单方法是用另一个字符串“加盐”该值。