2016-12-02 7 views
0

は、私は、PostgreSQLを使用して、人々のグループに、このような記録を持っている:Postgresウィンドウ関数で属性ごとにメディアンを見つける方法は?

name | people | indicator 
--------+--------+----------- 
group 1 | 1000 | 1 
group 2 | 100 | 2 
group 3 | 2000 | 3 

私は中央値人物ためindicatorを見つける必要があります。結果は私が

select median(name) over (order by indicator) from table1 

をすればそれはgroup 2なります

group 3 | 2000 | 3 

でなければなりません。

これをウィンドウ機能で選択できるかどうかはわかりません。

レコードあたり1000/2000行を生成することは、レコードに何百万人もの人がいるため、実用的ではないようです。

答えて

1

合計の中央値よりも大きい人の最初の累積和検索:

with the_data(name, people, indicator) as (
values 
    ('group 1', 1000, 1), 
    ('group 2', 100, 2), 
    ('group 3', 2000, 3) 
) 
select name, people, indicator 
from (
    select *, sum(people) over (order by name) 
    from the_data 
    cross join (select sum(people)/2 median from the_data) s 
    ) s 
where sum > median 
order by name 
limit 1; 

    name | people | indicator 
---------+--------+----------- 
group 3 | 2000 |   3 
(1 row) 
関連する問題