2

次の結果セットを生成しました

"degree_easy","degree_hard","easy_percent","hard_percent"
1,5,0.166667,0.833333
1,5,0.166667,0.833333
1,6,0.142857,0.857143
1,8,0.111111,0.888889

上記の結果セットは、次のクエリから生成されます。

select * from (
    select degree_one as degree_easy, 
        (degree_two + degree_three) as degree_hard,
        (degree_one::real/(degree_one::real + degree_two::real + degree_three::real)) 
            as easy_percent, 
        ((degree_two::real + degree_three::real)/(degree_one::real + degree_two::real +
            degree_three::real)) as hard_percent FROM recommendation_degree
    ) as dc 
where dc.degree_easy >= 1 and dc.degree_hard >= 1
order by dc.easy_percent ASC, dc.hard_percent ASC

今私がやろうとしているのは、パーセンタイルを計算することです:

上記のどの列を使用するのがより理にかなっているかはわかりませんが、degree_easy と degree_hard を使用してパーセンタイルまたは少なくとも 1 つを計算したいと仮定するとntile、postgres で関数を使用してこれを行うにはどうすればよいですか?

次のことを行う際のベストプラクティスは何ですか:

percentile, number_of_users
25, 4
50, 10
75, 20
99, 20
4

1 に答える 1

3

ntile順序付きリストの下位 25% にいるかどうかがわかります。ただし、重みには対応していません。機能するためntileには、すべてのグループのサイズが同じでなければなりません。

sum ... over分析関数を使用して重みを計算できます。実行中の合計 (現在の行と等しいかそれより低い値を持つすべての行の合計) は次のとおりです。

sum(col1) over (order by col1)

テーブル全体の合計は次のとおりです。

sum(col1) over ()

実行中の合計を全体の合計と比較することで、パーセンタイルを計算できます。簡単な例:

create table people (id serial, points int);
-- 3 people with 1 point, 2 people with 2 points, 1 person with 3 points
-- total 6 people and 10 points
insert into people (points) values (1), (1), (1), (2), (2), (3);

select  *
,       case 
        when sum(points) over (order by points) > 0.75 * sum(points) over () then '100%'
        when sum(points) over (order by points) > 0.5 * sum(points) over () then '75%'
        when sum(points) over (order by points) > 0.25 * sum(points) over () then '50%'
        else '25%'
        end as Percentile
from    people

どちらが印刷されますか:

ID    POINTS  PERCENTILE
1     1       50%
2     1       50%
3     1       50%
4     2       75%
5     2       75%
6     3       100%

1点の人は3点合わせて全体の30%。つまり、50% のパーセンタイルになります。2点の人は合計7点で上位75%に入る。3 ポイントの人は合計 10 になり、トップ ブラケットに配置されます。

SQL Fiddle の例。

于 2014-08-21T18:46:30.603 に答える