驚いたことに、postgresqlのn番目のパーセンタイル関数を見つけることができませんでした。
モンドリアンのolapツールでこれを使用しているので、95パーセンタイルを返す集計関数が必要です。
私はこのリンクを見つけました:
http://www.postgresql.org/message-id/[email protected]
しかし、何らかの理由で、そのパーセンタイル関数のコードは、特定のクエリで場合によってはnullを返しています。私はデータをチェックしましたが、それを引き起こすと思われる奇妙なデータはありません!
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
ここでは、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)
を使用した場合、フィルタリングする列はパーセンタイルになり、上記と同じクエリを使用できます。
上記のコメントのように、解決策はここにあります。配列の並べ替えとpercentile_cont関数の両方を必ず追加してください!