首页 > 解决方案 > T-SQL:用于计算第 N 个百分位数的聚合函数

问题描述

我正在尝试计算表中单个列中所有值的第 N 个百分位数。我想要的只是一个标量聚合值,其中 N% 的值低于。例如,如果表有 100 行,其中的值与行索引加一(连续 1 到 100)相同,那么我希望这个值告诉我 95% 的值低于 95。

PERCENTILE_CONT 分析函数看起来最接近我想要的。但是,如果我尝试像这样使用它:

SELECT PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY ValueColumn) OVER () AS P95

我在表中每行得到一行,所有值都相同。我可以TOP 1只给我这些行之一,但现在我已经完成了额外的表扫描。

我不是要创建一个由原始表中的其他列分区的结果的 wizbang 表。我只想要一个聚合的标量值。

编辑:我已经能够PERCENTILE_CONT在带有WHERE子句的查询中使用。例如:

DECLARE @P95 INT

SELECT TOP 1 @P95 = (PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY ValueColumn) OVER ())
FROM ExampleTable
WHERE LOWER(Color) = 'blue'

SELECT @P95

包含该WHERE子句会产生与没有它时不同的结果。

标签: sql-servertsqlstatisticsanalyticspercentile

解决方案


据我所知,你需要在这里做一个子查询。例如,要查找严格低于 95% 的记录数,我们可以尝试:

WITH cte AS (
    SELECT ValueColumn,
        PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY ValueColumn) OVER () AS P95
    FROM yourTable
)

SELECT COUNT(*)
FROM cte
WHERE ValueColumn < P95;

推荐阅读