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

时间:2012-04-20 17:58:24

标签: sql sql-server

我有一个直方图类型数据表。共有2列:Bucket,Count。

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

现在我的存储桶已订购,例如,让我们说存储桶指示完成任务所需的时间。我们可以有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因此结果将是桶2,因为所有条目的60%在桶2或更少

有没有办法在SQL中计算它?

谢谢!

2 个答案:

答案 0 :(得分:0)

注意: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 

当然,我没有在DECIMAL数据类型中转换任何值,因此您的Percentile列会失去一些精确度。

然后假设你需要代表Percentile 80的桶:

DECLARE @Percentile AS INT
SET @Percentile = 80

SELECT TOP 1 bucket FROM(
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 
) AS h
WHERE h.Percentile > @Percentile
ORDER BY Percentile;

答案 1 :(得分:0)

从SQL Server 2012开始,现在有SQL标准PERCENTILE_DISCPERCENTILE_CONT逆分布函数,可用于此目的。不幸的是,到目前为止,SQL Server仅将它们实现为窗口函数,而不是聚合函数。

它们在显示的数据集(看起来是预先汇总的)上不是很有用,但是它们对原始数据集绝对有帮助,您可以在其中进行简单的计算:

SELECT DISTINCT percentile_disc(0.6) WITHIN GROUP (ORDER BY bucket) OVER ()
FROM t

I have blogged about percentiles in SQL here, in more detail