【问题标题】:SQL Server - How to add a column of percentile values of another column?SQL Server - 如何添加另一列的百分位值列?
【发布时间】:2011-09-22 19:46:32
【问题描述】:

我想要一个计算字段,它可以为我提供表格中列值的百分位数。最好的方法是什么?

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

这里解释了百分位数的 2 个定义:http://onlinestatbook.com/chapter1/percentiles.html

我使用的是我知道的定义。示例:一个值位于第 25 个百分位表示 25% 的总体处于 AT 或低于该值。

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

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

【问题讨论】:

  • 能否确定列中是否存在重复项?此外,您所说的“百分位数”似乎有些混乱,所以我真的建议添加一些示例输入和输出来清除它。
  • @Chris Cunningham:这就是我所说的百分位数:en.wikipedia.org/wiki/Percentile。是的,可以有重复,就像 SAT 分数中有重复一样。
  • 给我们示例输入和输出。如果数字是1、2、3、4,你认为1的“百分位数”是10,还是0?
  • 克里斯,对于 1,它的百分位数是 25,因为 25% 的“人口”等于或低于 1。对于 2,百分位数是 50...

标签: sql sql-server statistics


【解决方案1】:

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

引用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

【讨论】:

  • 我添加了更多信息。我想知道大学理事会的人如何计算百分位数?我希望能够在我的桌子上做同样的事情。
  • @@user776676 - 如果您需要,请告诉我。
【解决方案2】:
select CAST(SUM(CASE WHEN Number <= 20 
        THEN 1 ELSE 0 END) as float)/COUNT(*) as PercentileFor20
from Numbers;

【讨论】:

    【解决方案3】:

    [编辑以匹配有问题的 cmets]:

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

    那么如果你的Numbers 是 2、5、10 和 14,你应该得到:

    Number   Percentile
    2        25
    5        50
    10       75
    14       100
    

    问题是:如果有重复,那么 ROW_NUMBER 会搞砸你。如果你的Numbers 是 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
    

    【讨论】:

    • @Alex Aza:那么百分位数将与上面相同。
    • @Chris Cunningham:您的示例并未反映我理解的百分位数的含义。请参考此链接:en.wikipedia.org/wiki/Percentile
    • 来自您的链接:“百分位数(或百分位数)是某个变量的值,低于该值的观察百分比。例如,第 20 个百分位数是低于 20 的值(或分数)可以找到百分之几的观察结果。”我的数字 5 位于第 25 个百分位,低于该百分位可以找到 25% 的观测值。
    • 克里斯,在您的示例中,5 是第 50 个百分位,因为 50% 的值等于或低于 5。
    • 如果您想使用“在或以下”而不是以下,那么我新编辑的答案现在应该适合您,但根据您链接到我的页面,这不是百分位数的含义-大学理事会也不是这样做的。如果您在数学 SAT 上获得 800 分,那么您的百分位数将为 93%,因为 93% 的人低于您。相反,您要求我们返回 100%,因为 100% 的人 在或低于您。这也很好,如果这就是你所说的百分位数。
    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多