0

我有一张直方图类型数据的表格。有 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 中计算这个?

谢谢!

4

2 回答 2

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列会丢失一些精度。

然后假设您需要代表百分位数 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;
于 2012-04-20T18:07:48.293 回答
0

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

它们对您显示的数据集(似乎是预先聚合的)不是很有用,但它们肯定会对源数据集有所帮助,您可以在其中简单地计算:

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

我在这里写了关于 SQL 百分位数的博客,更详细

于 2019-01-25T15:15:06.890 回答