数据集拆分 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
分配一个随机值。这是可重复的。获得不同桶的一种简单方法是用另一个字符串“加盐”该值。
我有一个数据集,我想将其分成 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
分配一个随机值。这是可重复的。获得不同桶的一种简单方法是用另一个字符串“加盐”该值。