0

ヒストグラム タイプのデータを含むテーブルがあります。バケット、カウントの 2 つの列があります。

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 したがって、すべてのエントリの 60% がバケット 2 以下にあるため、結果はバケット 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 に答える