sql-server - 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
子句会产生与没有它时不同的结果。
解决方案
据我所知,你需要在这里做一个子查询。例如,要查找严格低于 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;
推荐阅读
- routes - 我们可以在 Angular 5 网站中有两条动态名称的路线吗?
- elasticsearch - ElasticSearch / Kibana / Logstash:如何在数据表中拆分字符串?
- javascript - 通过在 Javascript 中单击外部来关闭下拉菜单(教程说明)
- excel - 用于 Excel 的 VBA;编辑非常大的文件
- python - 如果在 Rasa 中无法识别意图怎么办?
- java - 替换由 JSONArray 组成的 JSON 对象中的所有键
- java - Lucene - 内存不足错误
- angularjs - 在 Angularjs 中显示日期和小时
- python - 从文件中的每一行制作字典
- angularjs - angularjs中列值的总和