Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-如何添加另一列的百分位值列?_Sql_Sql Server_Statistics - Fatal编程技术网

SQL Server-如何添加另一列的百分位值列?

SQL Server-如何添加另一列的百分位值列?,sql,sql-server,statistics,Sql,Sql Server,Statistics,我希望有一个计算字段,该字段为我提供表中列值的百分比。最好的方法是什么 我有一个表,其中只有一列包含从0到10000的值,是随机分布的。我想添加另一列,告诉我同一行上的值相对于原始列中所有其他值的百分位数是多少 此处解释了百分位数的两种定义: 我使用的是我知道的定义。示例:值为25%表示25%的人口处于或低于该值 我想到的算法如下,我希望有人能帮我翻译成SQL,因为我是SQL初学者: 对于我表格中的所有行,如果值小于或等于当前行中的值,则计数++。在表的末尾,我做了一个除法:计数/行数以获得我的

我希望有一个计算字段,该字段为我提供表中列值的百分比。最好的方法是什么

我有一个表,其中只有一列包含从0到10000的值,是随机分布的。我想添加另一列,告诉我同一行上的值相对于原始列中所有其他值的百分位数是多少

此处解释了百分位数的两种定义:

我使用的是我知道的定义。示例:值为25%表示25%的人口处于或低于该值

我想到的算法如下,我希望有人能帮我翻译成SQL,因为我是SQL初学者:


对于我表格中的所有行,如果值小于或等于当前行中的值,则计数++。在表的末尾,我做了一个除法:计数/行数以获得我的百分位数。这对我来说足够准确,因为有很多行。

您不能创建依赖于其他行/表的计算列

引自:

表达式可以是非计算的 列名、常量、函数和 通过以下方式连接的任何组合: 一个或多个操作员。表情 不能是子查询

但是,您可以进行查询:

设置:

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

[编辑以匹配相关评论]:

SELECT Number, 100 * (ROW_NUMBER() OVER (ORDER BY Number))/Count(*) AS Percentile
FROM MyTable
然后,如果您的数字是2、5、10和14,您应该得到:

Number   Percentile
2        25
5        50
10       75
14       100
问题是:如果有重复的,那么行号会把你搞砸。如果您的号码是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

我们能确定该列中是否有重复项吗?此外,对于百分位数的含义似乎有些混淆,因此我真的建议添加一些示例输入和输出来澄清。@Chris Cunningham:以下是我所说的百分位数:。是的,可以有重复项,就像SAT分数中有重复项一样。给我们举个输入和输出的例子。如果数字是1、2、3和4,你认为1的百分位数是10还是0?克里斯,对于1,它的百分位数是25,因为25%的“人口”处于或低于1。对于2,百分位数是第50位…@Alex Aza:那么百分位数就和上面一样了。@Chris Cunningham:你的例子没有反映出我所理解的百分位数的含义。请参考此链接:从您的链接:百分位或百分位是某个变量的值,低于该变量,一定百分比的观察值会下降。例如,第20个百分位是一个值或分数,低于该值或分数可以找到20%的观察值。我的数字5位于第25个百分位,低于该百分位可以找到25%的观察值。克里斯,在你的例子中,5是第50个百分位,因为50%的值等于或低于5。如果你想使用等于或低于5而不是低于5,那么我新编辑的答案现在应该适用于你,但根据你链接到我的页面,这并不是百分位数的意思——大学董事会也不是这样做的。如果你在数学SAT考试中得了800分,你的百分位数将是93%,因为93%的人比你低。你要求我们100%的回报,因为100%的人都在你或低于你。这也很好,如果你说的是百分位数的话。我已经添加了更多的信息。我想知道,大学董事会的人是如何计算百分位数的?我希望能够在我的表中执行同样的操作。@@user776676-如果这是您需要的,请告诉我。
SELECT Number, MAX(100 * (ROW_NUMBER() OVER (ORDER BY Number))/Count(*)) AS Percentile
FROM MyTable
GROUP BY Number
Number   Percentile
2        25
5        75
14       100