2015-01-11 12 views
5

私は負荷テストのために100万回の応答タイミングを保存するタイミングと呼ばれるテーブルを持っています。このデータを100グループに分ける必要があります。つまり、最初の500レコードを1グループとして、平均ではなく、各グループのパーセンタイル。 、ポストグルでパーセンタイルを計算する方法

は、これまでのところ、私はこのクエリ

Select quartile 
    , avg(data) 
    , max(data) 
    FROM (

     SELECT data 
      , ntile(500) over (order by data) as quartile 
      FROM data 
     ) x 
GROUP BY quartile 
ORDER BY quartile 

を試みたが、どのように私は

答えて

6

ntile一つは、四分位数、十分位など、他のn-タイル、間(パーセンタイル計算方法であるパー​​センタイルを見つけなければなりませんの等。)。

ntileテーブルは、指定された数のバケットにできるだけ等しくグループ化します。 4つのバケットを指定した場合、それは四分位になります。 10は10倍になります。 500はここに来てどこにデータがあるパーセンタイルを決定する場合

パーセンタイルについて、あなたは...私はよく分からない100

するバケット数を設定します(百万回のバケットを100バケットに均等に分割する)場合は、ntileを引数100として使用し、グループには500を超えるエントリがあります。

avgでもmaxでも気にしない場合は、クエリから束を削除できます。だから、それは次のようになります。あなたはパーセンタイルを知りたい場合は

SELECT data, ntile(100) over (order by data) AS percentile 
FROM data 
ORDER BY data 
+0

各グループには100個のグループがあるため、500レコードが含まれています。したがって、ntileは自動的にパーセンタイルを計算しますか?グループごとに? – lampdev

+0

"各グループには500レコードが含まれています"という意味が不明です。どのグループ?すべてのデータは 'data'テーブルにあります。そのデータの 'ntile(100)'は100個のグループにデータをバケットしますが、多くの行はそれになります。そして、それはどのように与えられたデータセットのパーセンタイルを計算するかです。あなたが最初に500グループに分割した場合、それはもはやパーセンタイルではありません。 – khampson

+0

昇順から降順に行くパーセンタイルグラフをプロットする必要があります.tableには50,000のタイミングが含まれていますが、今度はこの50,000のタイミングをグループごとにパーセンタイルを計算すると、私はこれについてほとんど混乱していません。どのように達成するか – lampdev

4

通常、あなたはntileよりcume_distを使用して安全です。これは、入力が少ない場合にntileが奇妙に動作するためです。考えてみましょう:

=# select v, 
      ntile(100) OVER (ORDER BY v), 
      cume_dist() OVER (ORDER BY v) 
    FROM (VALUES (1), (2), (4), (4)) x(v); 

v | ntile | cume_dist 
---+-------+----------- 
1 |  1 |  0.25 
2 |  2 |  0.5 
4 |  3 |   1 
4 |  4 |   1 

あなたは99パーセンタイルを知りたい場合は、あなただけのことができcume_distはいつも0から1へのあなたの数を与えるところ、ntileはわずか100個のバケットのうち最初の4を使用していることがわかりますすべてのものをcume_distで0.99以下に投げ捨て、残りのものから最小のvを取ってください。

あなたがPostgres 9.4以降を使用している場合は、percentile_cont and percentile_discを使用すると、バケットを自分で構築する必要がないため、さらに簡単になります。前者は値間の補間を提供しますが、小さなデータセットを持つ場合にはこれもまた有用です。