我有数据,其中一些是NULL值,从中我希望提取的单一第90百分位值的列中:
ColA
-----
NULL
100
200
300
NULL
400
500
600
700
800
900
1000
针对上述情况,我寻找,一个技术搜索的第90百分位,800为第80百分时返回值900等类似的功能将是AVG(可乐),其用于上述数据返回550,或MIN(可乐),它返回100等
有什么建议么?
我有数据,其中一些是NULL值,从中我希望提取的单一第90百分位值的列中:
ColA
-----
NULL
100
200
300
NULL
400
500
600
700
800
900
1000
针对上述情况,我寻找,一个技术搜索的第90百分位,800为第80百分时返回值900等类似的功能将是AVG(可乐),其用于上述数据返回550,或MIN(可乐),它返回100等
有什么建议么?
如果你想获得完全相同的第90百分位值,不包括空值,我建议直接做计算。 下面的版本计算的行数和行数,并且选择适当的值:
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_DISC
和PERCENTILE_CONT
逆分布函数。 这些是(到目前为止)只能作为窗口的功能,而不是聚合函数,所以你必须删除,因为多余的结果缺乏分组,例如通过使用DISTINCT
或TOP 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
;
我在这里详细的博客上讲述百分点以上 。