Рассчитать процентильный ранг, используя NTILE? - PullRequest
6 голосов
/ 22 марта 2012

Нужно рассчитать процентильный ранг (1-й - 99-й процентиль) для каждого учащегося с баллом за один тест.

Меня немного смущает определение msdn NTILE , потому что это явно не упоминает процентиль ранг.Мне нужна какая-то уверенность в том, что NTILE - это правильное ключевое слово, используемое для расчета процентильного ранга.

declare @temp table
(
  StudentId int,
  Score int
)
insert into @temp
select 1, 20
union
select 2, 25
.....

select NTILE(100) OVER (order by Score) PercentileRank
from @temp

Мне кажется, это правильно, но правильный ли это способ вычисления процентильного ранга?

Ответы [ 5 ]

3 голосов
/ 20 декабря 2013

NTILE абсолютно НЕ совпадает с процентильным рангом.NTILE просто делит набор данных равномерно по предоставленному количеству (как отмечено выше в RoyiNamir).Если вы наметите результаты обеих функций, NTILE будет идеально линейной линией от 1 до n, тогда как в процентном ранге [обычно] будут некоторые кривые, в зависимости от ваших данных.

Процентный ранг оченьсложнее, чем просто разделить его на N. Затем он берет номер каждой строки и выясняет, где в распределении он лежит, интерполируя при необходимости (что очень сильно загружает процессор).У меня есть лист Excel из 525 000 строк, и он доминирует в ЦП моей 8-ядерной машины на 100% в течение 15-20 минут, просто чтобы выяснить функцию PERCENTRANK для одного столбца.

В этой статье дается лучшее объяснениепроцентное звание и как это сделать в SQL:

http://sqlmag.com/t-sql/calculate-percentiles

2 голосов
/ 13 октября 2016

Один из способов думать об этом: «процент студентов с баллами ниже этого».

Вот один из способов получить этот тип процентиля в SQL Server, используя RANK():

select *
    , (rank() over (order by Score) - 1.0) / (select count(*) from @temp) * 100 as PercentileRank
from @temp

Обратите внимание, что это всегда будет меньше, чем 100%, если вы не округлите, и вы всегда получите 0% для самых низких значений.Это не обязательно означает, что медианное значение равно 50%, и не будет интерполироваться, как это делают некоторые вычисления в процентилях.

Не стесняйтесь округлять или приводить все выражение (например, cast(... as decimal(4,2))) для хороших отчетов или дажезамените - 1.0 на - 1e, чтобы форсировать вычисление с плавающей запятой.

NTILE() на самом деле не то, что вы ищете в этом случае, потому что он по существу делит номера строк упорядоченного набора на группы, а нечем значения.Он назначит разные процентили двум экземплярам с одинаковым значением, если эти экземпляры окажутся между точкой пересечения.Затем вам нужно будет дополнительно сгруппировать по этому значению и взять максимальный или минимальный процентиль группы, чтобы использовать NTILE() так же, как мы делаем с RANK().

1 голос
/ 01 мая 2012

Проблема с вашим кодом связана с неравномерным распределением NTILE.Если у вас 213 учеников, в самых верхних 13 группах будет 3 ученика, а в последних 87 - по 2 ученика в каждой.Это не то, что вы хотели бы в идеале при распределении в процентилях.

Возможно, вы захотите использовать RANK / ROWNUM, а затем разделить, чтобы получить группу% ile.

0 голосов
/ 26 июля 2017

Я знаю, что это старая ветка, но в этой теме, конечно, много дезинформации, пробирающейся по интернету.

NTILE не предназначен для расчета процентильного ранга (процентного ранга АКА)

Если вы используете NTILE для расчета Процентного ранга, вы делаете это неправильно. Любой, кто говорит вам иначе, дезинформирован и ошибочен. Если вы используете NTILE (100) и получаете правильный ответ, то это чисто случайно.

Тим Ленер прекрасно объяснил проблему.

«Он назначит разные процентили двум экземплярам одного и того же значения, если эти случаи перекрывают точку пересечения.»

Другими словами, использование NTILE для вычисления рейтинга учеников на основе их тестовых баллов может привести к тому, что два студента с одинаковыми баллами получат разные процентные значения. И наоборот, два студента с разными баллами могут получить одинаковое процентное звание.

Более подробное объяснение того, почему NTILE является неподходящим инструментом для этой работы, а также гораздо более эффективная альтернатива проценту_ранка: Nasty Fast PERCENT_RANK. http://www.sqlservercentral.com/articles/PERCENT_RANK/141532/

0 голосов
/ 22 марта 2012

Есть ли опечатка?

select NTILE(100) OVER (order by Score) PercentileRank 
from @temp

И ваш сценарий выглядит хорошо.Если вы думаете, что что-то не так, не могли бы вы уточнить, что именно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...