web-dev-qa-db-ja.com

postgresqlのn番目のパーセンタイル計算

驚いたことに、postgresqlのn番目のパーセンタイル関数を見つけることができませんでした。

モンドリアンのolapツールでこれを使用しているので、95パーセンタイルを返す集計関数が必要です。

私はこのリンクを見つけました:

http://www.postgresql.org/message-id/[email protected]

しかし、何らかの理由で、そのパーセンタイル関数のコードは、特定のクエリで場合によってはnullを返しています。私はデータをチェックしましたが、それを引き起こすと思われる奇妙なデータはありません!

21
Codek

PostgreSQL 9.4では、パーセンタイルのネイティブサポートがあり、Ordered-Set Aggregate Functionsに実装されています。

percentile_cont(fraction) WITHIN GROUP (ORDER BY sort_expression) 

連続パーセンタイル:順序付けで指定された分数に対応する値を返し、必要に応じて隣接する入力項目間を補間します

percentile_cont(fractions) WITHIN GROUP (ORDER BY sort_expression)

複数の連続したパーセンタイル:非整数の各要素がそのパーセンタイルに対応する値で置き換えられた、fractionsパラメーターの形状に一致する結果の配列を返します

詳細については、ドキュメントを参照してください: http://www.postgresql.org/docs/current/static/functions-aggregate.html

いくつかの例についてはこちらをご覧ください: https://github.com/michaelpq/michaelpq.github.io/blob/master/_posts/2014-02-27-postgres-9-4-feature-highlight-within -group.markdown

32
alfonx

ここでは、ntile関数が非常に便利です。テーブル_test_temp_があります:

_select * from test_temp

score
integer
3
5
2
10
4
8
7
12

select score, ntile(4) over (order by score) as quartile from test_temp;

score    quartile
integer  integer
2        1
3        1
4        2
5        2
7        3
8        3
10       4
12       4
_

ntile(4) over (order by score)は、スコアによって列を順序付け、4つの偶数グループに分割し(数値が均等に分割される場合)、順序に基づいてグループ番号を割り当てます。

ここには8つの数字があるので、0、12.5、25、37.5、50、62.5、75、87.5パーセンタイルを表します。したがって、quartileが2の結果のみを取得すると、25番目と37.5番目のパーセンタイルが得られます。

_with ranked_test as (
    select score, ntile(4) over (order by score) as quartile from temp_test
)
select min(score) from ranked_test
where quartile = 2
group by quartile;
_

8のリストで3番目に大きい番号_4_を返します。

より大きなテーブルがあり、ntile(100)を使用した場合、フィルタリングする列はパーセンタイルになり、上記と同じクエリを使用できます。

18
Mike

上記のコメントのように、解決策はここにあります。配列の並べ替えとpercentile_cont関数の両方を必ず追加してください!

https://stackoverflow.com/a/14309370/330315

1
Codek