Подтвердить что ты не робот

Хотите узнать больше о NTILE()

Я читал функцию РЕЙТИНГ для ms sql. Я понимаю, что другие функции, кроме NTILE(). Допустим, если у меня есть эти данные:

   StudentID     MARKS  
      S1           75  
      S2           83
      S3           91
      S4           83
      S5           93  

Итак, если я делаю NTILE(2) OVER(ORDER BY MARKS desc), что будет результатом и почему?
А что, если это NTILE(3)? Простое объяснение кому-нибудь?

4b9b3361

Ответ 1

Подумайте, что это как ведра, NTILE (2) сделает 2 ведра, половина строк будет иметь значение 1, а другая половина значения 2

Пример

create table  #temp(StudentID char(2),    Marks  int) 
insert #temp  values('S1',75 ) 
insert #temp  values('S2',83)
insert #temp  values('S3',91)
insert #temp  values('S4',83)
insert #temp  values('S5',93 ) 


select NTILE(2) over(order by Marks),*
from #temp
order by Marks

Вот результат, так как у вас есть нечетное количество строк, у bucket 1 будет 1 строка больше

1   S1  75
1   S2  83
1   S4  83
2   S3  91
2   S5  93

Если вы добавите еще одну строку

insert #temp  values('S6',92 ) 

Теперь оба ведра имеют 3 строки

1   S1  75
1   S2  83
1   S4  83
2   S3  91
2   S6  92
2   S5  93

На самом деле, я никогда не использовал NTILE в производственном коде, но я могу увидеть, где вам нужно разбить результаты на n число ковшей

Ответ 2

Он упорядочивает данные в порядке убывания меток и затем разбивает на две группы.

Если данные не могут быть разделены на равные группы, то первые несколько групп будут иметь больше строк, чем последние группы.

Итак, NTILE (2) даст вам

StudentID       MARKS       NTILE  
      S5           93           1 
      S3           91           1 
      S2           83           1
      S4           83           2
      S1           75           2 

Аналогично NTILE (3) даст вам

StudentID       MARKS       NTILE  
      S5           93           1 
      S3           91           1 
      S2           83           2
      S4           83           2
      S1           75           3  

Ответ 3

Я использую NTILE довольно часто, чтобы разбить списки адресов электронной почты на ведра для тестирования 10/10/80. Например, мы тестируем строку темы электронной почты и хотим отправить один из двух вариантов на 10% каждого из списка, причем тот, который лучше всего отправляется на остальные 80%.

SELECT [список полей], (NTILE (10) OVER (порядок от newid())) - 1 AS Сегмент FROM [data]

"order by newid()" обеспечивает случайный порядок. Синтаксис "[NTILE...] - 1" является прямым результатом некоторых других инструментов, которые мы используем для синтаксического анализа текста вместо целочисленной математики, поэтому было проще получить результаты от 0 до 9, а не от 1 до 10, Поле сегмента будет заполнено значением от 0 до 9, которое я могу использовать, чтобы отделить 10% записей довольно легко и не раз для кампаний с несколькими усилиями к ним.

Если вам нужен запрос с реплицируемыми результатами, вам нужно будет использовать что-то детерминированное в предложении order by или добавить столбец с GUID для использования для предложения order by.

Предложение PARTITION BY будет использоваться для создания групп ведер на основе состояния или профессии или некоторой другой заданной группировки, то есть NTILE (10) OVER (PARTITION BY ORDER BY newid()) или некоторых таких. Я считаю, что предложение ORDER BY требуется - PARTITION BY не является обязательным.

Ответ 4

Вначале функция Ntile подсчитывает количество строк и делит ее на параграф, передаваемый в ntile, а затем создает равную группу строк в соответствии с частным и оценивает их, а затем оставшиеся строки будут распределяться каждой группой сверху смещение и не будет принимать его из наименьших строк, например, если у группы 1 есть 4 строки, тогда он займет 5-ю строку в своей группе, а не в последней строке.

Спасибо

Ответ 5

Ntile без использования предложения раздела просто разделите набор данных на основе номера в ntile (number), чтобы: если ни один из строк не равен 7, например: 1,1,1,2,3,4,5 ntile ( 3) даст 3,2,2. Как я получил 3,2,2?. Сначала предположим, что 7 - 6 (один меньше, чтобы сделать это), 6/3 дает 2,2,2, затем добавьте +! для первого раздела. Если строк нет, тогда проблем нет. просто разделите набор данных

Ntile, используя раздел partition, просто разделите набор данных на основе значений в наборе данных таким образом, что: если ни один из строк не равен 7, значения строки строки: 1,1,1,2,3,4,5 then: ntile ( 3), разделенное на значение, даст: 1,2,3,1,1,1,1. Как я получил это?. Во-первых, сломайте набор данных на основе значений: здесь 1,1,1 является одним partiton, затем все значения образуют другой раздел. Затем начните назначать ntile rank каждому разделу. Здесь 1,1,1 станет 1,2,3, а затем продолжит следующий раздел, вы можете вывести ранг только до номера, указанного в функции ntile()