从存储过程中运行时,Ntile函数无法将组平均分配

时间:2018-10-09 13:14:03

标签: sql sql-server random

我在存储过程中有以下代码。

select 
ID,NTILE(2) OVER (Partition by GroupID order by newID()) as RandomSplit
into #TempSplit
from TableA
where IsUpdated = 1

Update a
set a.SplitColumn = CASE WHEN b.RandomSplit = 1 THEN 'A'
                       WHEN b.RandomSplit = 2 THEN 'B' 
                  END
from Table A a
inner join #TempSplit b
on a.ID = b.ID and a.IsUpdated = 1

此代码按预期工作,并生成下面的数据表。

  GroupID  SplitColumn

   1       |     A
   1       |     A
   1       |     B
   1       |     B
   2       |     A
   3       |     A
   3       |     B

但是,当我从存储过程中执行此代码时,会得到以下结果

  GroupID  SplitColumn

   1       |     A
   1       |     A
   1       |     A
   1       |     B
   2       |     A
   3       |     A
   3       |     B

这是示例数据,但是基本上发生的是,当我从存储过程执行时,组并不是均匀分布的(在实际数据中,变化是成千上万,而不仅仅是一个)。不知道到底是什么导致了此行为,因为如果我再次手动执行代码,它将带来正确的行为。 我也知道这只是正在发生的事情的一小部分,但并不是所有GroupID都在发生。表示GroupID = 3总是正确地分成两个偶数组,而说GroupID = 1总是被错误地分为两类。

1 个答案:

答案 0 :(得分:0)

您仅为#TempSplit所在的行创建IsUpdated = 1

但是,您将重新加入 all 值。如果idTableA中重复,那么您将看到所得到的结果。