32

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

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

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

http://www.postgresql.org/message-id/162867790907102334r71db0227jfa0e4bd96f48b8e4@mail.gmail.com

しかし、何らかの理由で、そのパーセンタイル関数のコードが特定のクエリで null を返す場合があります。データを確認しましたが、その原因と思われるデータに異常はありません!

4

2 に答える 2

44

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)

複数の連続パーセンタイル: 分数パラメーターの形状に一致する結果の配列を返します。null 以外の各要素は、そのパーセンタイルに対応する値に置き換えられます。

詳細については、ドキュメントを参照してください: 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

CREATE TABLE aa AS SELECT generate_series(1,20) AS a;
--SELECT 20

WITH subset AS (
    SELECT a AS val,
        ntile(4) OVER (ORDER BY a) AS tile
    FROM aa
)
SELECT tile, max(val)
FROM subset GROUP BY tile ORDER BY tile;

 tile | max
------+-----
    1 |   5
    2 |  10
    3 |  15
    4 |  20
(4 rows)
于 2015-01-05T17:04:20.577 に答える
22

この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;

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

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

于 2014-10-07T17:09:59.453 に答える