【问题标题】:TSQL - 50:50 split of records in group byTSQL - 50:50 分组记录
【发布时间】:2015-06-27 23:27:15
【问题描述】:

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

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

提前感谢您的帮助。

【问题讨论】:

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


    【解决方案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;
    

    这将适用于其他测试单元。

    【讨论】:

    • 所以如果我需要更新table t,我可以使用update t set myfield = 'Test 1' from (...。那会是正确的吗?也不难,这是否可以进一步应用于偶数 3 或 4 路拆分?
    猜你喜欢
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多