Функция Ntile не делит группы равномерно при запуске из хранимой процедуры - PullRequest
0 голосов
/ 09 октября 2018

У меня есть следующий код внутри хранимой процедуры.

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 = 3 всегда корректно разбивается на две четные группы, в то время как GroupID = 1 всегда ошибочно разбивается.

1 Ответ

0 голосов
/ 09 октября 2018

Вы создаете #TempSplit только для строк, где IsUpdated = 1.

Однако вы присоединяетесь к всем значениям.Если id дублируется в TableA, то вы получите результаты, как видите.

...