我试图计算表中单个列中所有值的第N个百分位数。我想要的只是一个标量的聚合值,其中N%的值低于此值。例如,如果表有100行,其中值与行索引加1(连续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
子句给出的结果与我没有它的结果不同。
据我所知,你需要在这里做一个子查询。例如,要查找严格低于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;