我有一个直方图类型数据表。共有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中计算它?
谢谢!
答案 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_DISC
和PERCENTILE_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。