TSQL - 50:50 分组依据中的记录拆分
TSQL - 50:50 split of records in group by
我正在尝试找到一种拆分记录以进行测试的方法。我有几个列需要考虑,例如 mailsegment 和 pack。我希望在两个级别上均等(或接近)拆分并汇总。
我已经看到了这个解决方案 (How do I select TOP 5 PERCENT from each group?) 并将其应用于我的问题并在详细级别上取得了合理的成功,但是当我将我的段滚动到包级别时它不是均匀的。这是由于在某些情况下邮件段的记录数为奇数。有没有一种方法可以在包级别(例如,只有 2 包)平衡它,并且仍然在我的邮件段(200 多个段)中准确地对我的样本进行分层?
在此先感谢您的帮助。
你要的是分层样本。您可以通过使用 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;
这将适用于额外的测试单元。
我正在尝试找到一种拆分记录以进行测试的方法。我有几个列需要考虑,例如 mailsegment 和 pack。我希望在两个级别上均等(或接近)拆分并汇总。
我已经看到了这个解决方案 (How do I select TOP 5 PERCENT from each group?) 并将其应用于我的问题并在详细级别上取得了合理的成功,但是当我将我的段滚动到包级别时它不是均匀的。这是由于在某些情况下邮件段的记录数为奇数。有没有一种方法可以在包级别(例如,只有 2 包)平衡它,并且仍然在我的邮件段(200 多个段)中准确地对我的样本进行分层?
在此先感谢您的帮助。
你要的是分层样本。您可以通过使用 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;
这将适用于额外的测试单元。