Процентильный расчет с оконной функцией

Я знаю, что вы можете получить среднее, общее, минимальное и максимальное значение по подмножеству данных, используя оконную функцию. Но можно ли с помощью оконной функции получить, скажем, медиану или 25-й процентиль вместо среднего?

Другими словами, как мне переписать это, чтобы получить идентификатор и 25-й или 50-й процентиль продаж в каждом районе, а не в среднем?

SELECT id, avg(sales)
    OVER (PARTITION BY district) AS district_average
FROM t

person Stephen Smith    schedule 25.09.2016    source источник


Ответы (1)


Вы можете написать это как функцию агрегации, используя percentile_cont() или percentile_disc():

select district, percentile_cont(0.25) within group (order by sales)
from t
group by district;

К сожалению, Postgres в настоящее время не поддерживает их как оконные функции:

select id, percentile_cont(0.25) within group (order by sales) over (partition by district) 
from t;

Итак, вы можете использовать join:

select t.*, p_25, p_75
from t join
     (select district,
             percentile_cont(0.25) within group (order by sales) as p_25,
             percentile_cont(0.75) within group (order by sales) as p_75
      from t
      group by district
     ) td
     on t.district = td.district
person Gordon Linoff    schedule 25.09.2016
comment
Когда я это делаю, я получаю следующую ошибку: OVER не поддерживается для агрегата с упорядоченным набором centile_cont ... что странно, потому что у меня Postgres 9.5, и я думал, что он стал поддерживаться в 9.4? - person Stephen Smith; 25.09.2016
comment
@СтивенСмит. . . Документация — если вы внимательно ее прочитаете — ясно, что функции процентилей являются только функциями агрегирования, а не оконными функциями. - person Gordon Linoff; 25.09.2016