【问题标题】:T-SQL: Calculating the Nth Percentile Value from columnT-SQL:计算列的第 N 个百分位值
【发布时间】:2019-01-25 23:25:30
【问题描述】:

我有一列数据,其中一些是 NULL 值,我希望从中提取单个第 90 个百分位

ColA
-----
NULL
100
200
300
NULL
400
500
600
700
800
900
1000

对于上述内容,我正在寻找一种技术,它在搜索第 90 个百分位时返回值 900,在第 80 个百分位搜索时返回 800,等等。类似的函数是 AVG(ColA),它为上述数据返回 550,或返回 100 的 MIN(ColA) 等。

有什么建议吗?

【问题讨论】:

  • 你总是有 10 个非空值吗?

标签: sql tsql


【解决方案1】:

如果你想准确地得到第 90 个百分位值,不包括 NULL,我建议直接进行计算。以下版本计算行数和行数,并选择合适的值:

select max(case when rownum*1.0/numrows <= 0.9 then colA end) as percentile_90th
from (select colA,
             row_number() over (order by colA) as rownum,
             count(*) over (partition by NULL) as numrows
      from t
      where colA is not null
     ) t

我将条件放在 SELECT 子句而不是 WHERE 子句中,因此您可以轻松获得第 50 个百分位数、第 17 个百分位数或任何您想要的值。

【讨论】:

  • 如果操作只寻找一个值作为第 90 个百分位数,不应该是所有第 90 个百分位数的平均值或中值吗?比如说,位置 90.5 而不是位置 90.0?
  • @Dems ...不完全是。一般来说,如果存在,拆分将恰好是 90% 的值。否则,传统上将其视为紧接之前和紧接之后的值的平均值。我认为第 90 个图块的平均值更接近您的想法。一个有效的计算,但不是所谓的第 90 个百分位数。对于如何处理重复值可能存在很大分歧,因为相同的值可能是第 80 个百分位数和第 90 个百分位数(在任一计算中)。
  • 为迟到的“接受”道歉!你的答案是我用的,戈登。再次感谢。
【解决方案2】:
WITH
  percentiles AS
(
  SELECT
    NTILE(100) OVER (ORDER BY ColA) AS percentile,
    *
  FROM
    data
)
SELECT
  *
FROM
  percentiles
WHERE
  percentile = 90


注意:如果数据的观测值少于 100,则并非所有百分位数都有值。同样,如果您有超过 100 个观察值,某些百分位数将包含更多值。

【讨论】:

  • +1 表示NTILE。请注意,如果值少于 100 个,假设只有 50 个值...那么百分位数将为 1 - 50... 因此,如果值超过 90 个,则只有 90 个百分位数。
  • 谢谢。这是朝着正确方向迈出的一步。我正在编辑我的帖子以指出另外两个要求:数据包含许多 NULL,它们应该被忽略,我的目标是导出一个值( 90th 百分位值)。
【解决方案3】:

从 SQL Server 2012 开始,现在有 PERCENTILE_DISCPERCENTILE_CONT 逆分布函数。这些(到目前为止)仅可用作窗口函数,而不是聚合函数,因此由于缺少分组,您必须删除冗余结果,例如通过使用DISTINCTTOP 1

WITH t AS (
  SELECT *
  FROM (
    VALUES(NULL),(100),(200),(300),
      (NULL),(400),(500),(600),(700),
      (800),(900),(1000)
  ) t(ColA)
)
SELECT DISTINCT percentile_disc(0.9) WITHIN GROUP (ORDER BY ColA) OVER()
FROM t
;

I have blogged about percentiles more in detail here.

【讨论】:

    猜你喜欢
    • 2019-07-19
    • 2012-12-28
    • 2011-10-10
    • 2019-02-09
    • 2012-11-01
    • 2012-10-28
    • 2017-12-03
    • 2013-08-10
    • 2015-08-01
    相关资源
    最近更新 更多