繁体   English   中英

T-SQL:从列计算第N个百分位值

[英]T-SQL: Calculating the Nth Percentile Value from column

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

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

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

有什么建议么?

如果你想准确得到第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个或任何您想要的值。

WITH
  percentiles AS
(
  SELECT
    NTILE(100) OVER (ORDER BY ColA) AS percentile,
    *
  FROM
    data
)
SELECT
  *
FROM
  percentiles
WHERE
  percentile = 90


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

从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
;

我在这里更详细地写了关于百分位数的博客

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM