【发布时间】:2019-07-19 11:24:51
【问题描述】:
我正在尝试计算表中单个列中所有值的第 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 表。我只想要一个聚合的标量值。
编辑:我已经能够在带有WHERE 子句的查询中使用PERCENTILE_CONT。例如:
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-server tsql statistics analytics percentile