Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何根据不同的标准划分组_Sql_Oracle_Testing_Case When_Ab Testing - Fatal编程技术网

Sql 如何根据不同的标准划分组

Sql 如何根据不同的标准划分组,sql,oracle,testing,case-when,ab-testing,Sql,Oracle,Testing,Case When,Ab Testing,我试图根据A到F列的值将测试组和控制组分配给下表 最后,我想要一张如下所示的桌子。如果不同的ZIP对所有列具有相同的值,则将一半ZIP分配给测试,另一半分配给控制。如果拉链的总数不能平均分配,那么就给控件额外的拉链 您可以使用行编号()和mod(): row\u number()为共享相同(A、B、C、D、E、F)值的记录分配递增的数字,按递增的zip顺序排列。我们会将偶数行分配给测试组T,将非偶数分配给组C,我认为分层抽样可以满足您的要求: select t.*, (case

我试图根据A到F列的值将测试组和控制组分配给下表

最后,我想要一张如下所示的桌子。如果不同的ZIP对所有列具有相同的值,则将一半ZIP分配给测试,另一半分配给控制。如果拉链的总数不能平均分配,那么就给控件额外的拉链


您可以使用
行编号()
mod()


row\u number()
为共享相同
(A、B、C、D、E、F)
值的记录分配递增的数字,按递增的
zip
顺序排列。我们会将偶数行分配给测试组
T
,将非偶数分配给组
C

,我认为分层抽样可以满足您的要求:

select t.*,
       (case when mod(row_number() over (order by a, b, c, d, e, f), 2) = 1
             then 'C' else 'T'
        end) as test_group
from t;
这并不是问题的确切措辞,但它应该具有相同的效果,将列中具有相同值的行均匀地拆分为两组。当有奇数时,有时额外的数据将用于测试,有时用于控制


这个问题不清楚你是否想要平衡的控制组和测试组——这正是我所期望的。如果你真的想让所有奇数组都去控制(如你所建议的),那么所有的单数组都将在控制中,这对我来说似乎有偏见。

你对奇数组的定义将导致一个有偏见的控制组,因为所有的单数组最终都会在该组中。这太好了,谢谢!奇数用于测试或控制并不重要,所以这正是我需要的@狮子。你的问题措辞不同,这就是为什么我在这个答案中阐述了这么多。我猜分层抽样正是你想要的。这通常是将数据分成两个统计上相似的组的最佳方法。欢迎@Lion!如果这正确回答了您的问题,请单击复选标记。。。谢谢
select t.*,
       (case when mod(row_number() over (order by a, b, c, d, e, f), 2) = 1
             then 'C' else 'T'
        end) as test_group
from t;