从SQL中的直方图类型数据生成百分位数

从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

Bucket是直方图Bucket,Count是该Bucket中的值数

现在我的bucket已经被订购了,比如说,bucket表示完成一项任务所花费的时间。我们可以选择0-5分钟、5-10分钟、10-15分钟等

我想计算的是哪个桶落在第xx百分位。例如,如果90%的任务在12分钟内完成,那么我想知道90%的任务在10-15桶或更少

例如,假设我有下表:

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