数据集拆分70-30 SQL

数据集拆分70-30 SQL,sql,amazon-redshift,Sql,Amazon Redshift,我有一个数据集,我想分为两组,拆分为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 f

我有一个数据集,我想分为两组,拆分为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 
谢谢

示例数据:

使用者 身份证件 第3栏 123214123 abc Y 544354342 abc N 43241231 def Y 231213123 def Y 123123123 abc Y
考虑到您的限制,您不能使用ntile,因为它的重点是将存储桶设置为正确的大小。相反,您可以使用秩:

注意,这任意使用md5为每个id分配一个随机值。这是可重复的。获取不同存储桶的一种简单方法是使用另一个字符串对值进行加密

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;