Хотите узнать больше о 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)
?
Простое объяснение кому-нибудь?
Ответы
Ответ 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()