首页 > 解决方案 > 选择 50% 的行。在列中的文本之间均匀分割

问题描述

假设我有一个名为 tblOrder 的下表(我包括 20 行,但包含更多):我想创建一个选择查询,它将返回一半的行(选择前 50%),但随机将行分布在 a、b 之间,c和d。所以在这种情况下,它将返回 2 和 a,2 和 b,2 和 c 和 2 和 d - 剩下的 2 将是 1 a 和 1 b

在此处输入图像描述

标签: sqlsql-servertsql

解决方案


如果你想要一个真正随机的样本,你可以使用:

select o.*
from (select o.*,
             ntile(2) over (order by newid()) as tile
      from tblOrder o
     ) o
where tile = 2;

如果你想要一个分层样本,它试图保持四个值的原始分布,你可以使用:

select o.*
from (select o.*,
             ntile(2) over (partition by col2 order by newid()) as tile
      from tblOrder o
     ) o
where tile = 1;

推荐阅读