从SQL中的直方图类型数据生成百分位数
我有一个带有直方图类型数据的表。有两列:Bucket、Count Bucket是直方图Bucket,Count是该Bucket中的值数 现在我的bucket已经被订购了,比如说,bucket表示完成一项任务所花费的时间。我们可以选择0-5分钟、5-10分钟、10-15分钟等 我想计算的是哪个桶落在第xx百分位。例如,如果90%的任务在12分钟内完成,那么我想知道90%的任务在10-15桶或更少 例如,假设我有下表:从SQL中的直方图类型数据生成百分位数,sql,sql-server,Sql,Sql Server,我有一个带有直方图类型数据的表。有两列:Bucket、Count Bucket是直方图Bucket,Count是该Bucket中的值数 现在我的bucket已经被订购了,比如说,bucket表示完成一项任务所花费的时间。我们可以选择0-5分钟、5-10分钟、10-15分钟等 我想计算的是哪个桶落在第xx百分位。例如,如果90%的任务在12分钟内完成,那么我想知道90%的任务在10-15桶或更少 例如,假设我有下表: Bucket | Count -------------- 0 | 1
Bucket | Count
--------------
0 | 10
1 | 15
2 | 5
3 | 15
如果我想计算第60百分位。应该是
10+15+5+15*.60=27,因此结果将是bucket 2,因为60%的所有条目位于bucket 2或更少
有没有一种方法可以在SQL中计算这一点
谢谢 注意:COUNT是一个保留的SQL字,所以您可能应该使用valueCount
假设您的表名为histogramTable,则应该是这样的:
SELECT bucket,
(SELECT SUM(valuecount)
FROM histogramTable AS in1
WHERE in1.bucket <= ot.bucket
) * 100 / (
SELECT SUM(valueCOUNT)
FROM histogramTable AS in1
) As Percentile
FROM histogramTable AS ot
从SQL Server 2012开始,现在有SQL标准和反向分布函数,可用于此目的。不幸的是,到目前为止,SQLServer只将它们实现为窗口函数,而不是聚合函数 它们在您显示的数据集(似乎是预先聚合的)上不是很有用,但在源数据集上肯定会有帮助,您可以简单地计算:
SELECT DISTINCT percentile_disc(0.6) WITHIN GROUP (ORDER BY bucket) OVER ()
FROM t
.什么是直方图数据类型?我的表格中的数据的格式可以优化Higram视图。就像我上面说的,我有一列用于存储桶,然后计算属于该存储桶的任务数。您能展示CREATE TABLE和sample insert语句吗?这样,我们这些直方图不流利的人就可以拼凑出您所说的内容?哪个SQL Server版本?SELECT@@@VERSIONI刚刚看到您编辑的问题,所以让我花几分钟时间调整我的答案以满足您的需要:您的建议导致了以下结果,虽然有效,但运行速度非常慢:选择bucket,从mytable中选择SUMvaluecount作为in1,其中in1。bucket选择10+15+5+15*.75作为A,10+15+5+15*75/100作为AB@BogdanSahlean:你是认真的吗?如果是这样的话,那就是一个数据库,他无法预测表中包含的值,也无法预测值的数量。@FrancisP:我的评论是指算术计算:10/4 10/4.0。
SELECT DISTINCT percentile_disc(0.6) WITHIN GROUP (ORDER BY bucket) OVER ()
FROM t