TSQL - 50:50分组记录

时间:2015-04-21 01:42:22

标签: sql-server tsql common-table-expression sample

我正试图找到一种方法来分割测试记录。我有几个列需要考虑,如mailsegment和pack。我希望在两个级别上得到一个均匀(或接近)的分割并卷起来。

我已经看到了这个解决方案(How do I select TOP 5 PERCENT from each group?)并在详细级别上将其应用于我的问题并取得了合理的成功,但是当我将我的片段提升到包级别时它甚至都没有。这是由于邮件分段在某些情况下具有奇数个记录。有没有一种方法可以在包装级别(例如只有2包)平衡这一点,并且仍然可以在我的邮件段(200多个段)中准确地对我的样本进行分层?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

你想要的是一个分层的样本。您可以使用row_number()并取第n个值来执行此操作:

select t.*
from (select t.*,
             row_number() over (partition by mailsegment, pack order by newid()) as seqnum
      from table t
     ) t
where seqnum % 20 = 1;

编辑:

上面应该可行,但实际上更好的是在没有分区的情况下对数据进行排序。

有关更新:

with toupdate as (
      select t.*,
             row_number() over (order by mailsegment, pack, newid()) as seqnum
      from table t
     )
update toupdate
    set myField = 'Test 1'
    where seqnum % 20 = 1;

这适用于其他测试单元。