use*_*676 3 sql sql-server statistics
我想有一个计算字段,它给出了表格中列值的百分位数.这样做的最佳方法是什么?
我有一个表只有一列包含0到10000之间的值,随机分布.我想添加另一列来告诉我相同行的值相对于原始列中的所有其他值的百分位数.
这里解释了百分位数的2种定义:http://onlinestatbook.com/chapter1/percentiles.html.
我正在使用我所知道的定义.示例:值为25百分位表示25%的人口为AT或低于该值.
我想到的算法如下,我希望有人可以为我翻译为SQL,因为我是一个SQL初学者:
对于我表中的所有行,如果该值小于或等于当前行中的值,则计算++.在表的末尾,我做了除法:计数/行数以获得我的百分位数.这对我来说足够准确,因为有很多行.
[编辑以匹配有问题的评论]:
SELECT Number, 100 * (ROW_NUMBER() OVER (ORDER BY Number))/Count(*) AS Percentile
FROM MyTable
Run Code Online (Sandbox Code Playgroud)
然后如果你的Number
s是2,5,10和14,你应该得到:
Number Percentile
2 25
5 50
10 75
14 100
Run Code Online (Sandbox Code Playgroud)
这是问题所在:如果有重复项,那么ROW_NUMBER会搞砸你.如果您的Number
s是2,5,5和14,上面的代码将为您提供:
Number Percentile
2 25
5 50
5 75
14 100
Run Code Online (Sandbox Code Playgroud)
所以...这样做.
SELECT Number, MAX(100 * (ROW_NUMBER() OVER (ORDER BY Number))/Count(*)) AS Percentile
FROM MyTable
GROUP BY Number
Run Code Online (Sandbox Code Playgroud)
如果您的号码是2,5,5,14,它应该返回
Number Percentile
2 25
5 75
14 100
Run Code Online (Sandbox Code Playgroud)