SQL Server - Как добавить столбец значений процентиля другого столбца? - PullRequest
2 голосов
/ 26 июня 2011

Я хотел бы иметь вычисляемое поле, которое дает мне процентиль значения столбца в таблице.Каков наилучший способ сделать это?

У меня есть таблица только с одним столбцом, содержащим значения в диапазоне от 0 до 10000, распределенные случайным образом.Я хочу добавить еще один столбец, чтобы сообщить мне, каков процентиль значения в той же строке относительно всех других значений в исходном столбце.

Существует два определения процентиля, как описано здесь: http://onlinestatbook.com/chapter1/percentiles.html.

Я использую определение, которое я знал.Пример: значение в 25-м процентиле означает, что 25% населения имеют AT или ниже значения.

Алгоритм, о котором я думаю, приведен ниже, я надеюсь, что кто-то может перевести его для SQL для меня, потому что яНовичок SQL:

Для всех строк в моей таблице, если значение меньше или равно значению в текущей строке, то count ++.В конце таблицы делаю деление: количество / количество строк, чтобы получить мой процентиль.Это достаточно точно для меня, потому что есть много строк.

Ответы [ 3 ]

5 голосов
/ 26 июня 2011

[Отредактировано, чтобы соответствовать комментариям в вопросе]:

SELECT Number, 100 * (ROW_NUMBER() OVER (ORDER BY Number))/Count(*) AS Percentile
FROM MyTable

Тогда, если ваши Number с 2, 5, 10 и 14, вы должны получить:

Number   Percentile
2        25
5        50
10       75
14       100

Вот проблема: если есть дубликаты, то ROW_NUMBER облажает вас.Если ваши Number s равны 2, 5, 5 и 14, приведенный выше код даст вам:

Number   Percentile
2        25
5        50
5        75
14       100

Итак ... сделайте это вместо этого.

SELECT Number, MAX(100 * (ROW_NUMBER() OVER (ORDER BY Number))/Count(*)) AS Percentile
FROM MyTable
GROUP BY Number

Есливаши номера 2, 5, 5, 14, он должен вернуть

Number   Percentile
2        25
5        75
14       100
1 голос
/ 26 июня 2011
select CAST(SUM(CASE WHEN Number <= 20 
        THEN 1 ELSE 0 END) as float)/COUNT(*) as PercentileFor20
from Numbers;
1 голос
/ 26 июня 2011

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

Цитата из MSDN :

Выражение может быть не вычисленным имя столбца, константа, функция и любая комбинация этих связанных один или несколько операторов. Выражение не может быть подзапросом.

Однако вы можете сделать запрос:

Настройка:

declare @Test table (Value int)

insert @Test
values
    (1),
    (2),
    (3),
    (4),
    (5),
    (7),
    (10)

Запрос:

select *, (select sum(Value) from @Test t2 where t2.Value <= t1.Value) * 100.0 / sum(Value) over()
from @Test t1

Результат:

Value       Percentile
----------- ---------------------------------------
1           3.125000000000
2           9.375000000000
3           18.750000000000
4           31.250000000000
5           46.875000000000
7           68.750000000000
10          100.000000000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...