2016-08-24 2 views
4

Я использую новый percentile_cont в Postgres для вычисления процентилей для таблицы с момента ее запуска. Однако мы теперь меняем таблицу, чтобы включить мощность для каждой строки, и я не уверен, как реализовать percentile_cont, чтобы принять это во внимание.Postgres percentile_cont с мощностью

Скажем, таблица выглядела, как это раньше:

+--------+--------------+ 
| name | age   | 
+--------+--------------+ 
| Joe | 10   | 
+--------+--------------+ 
| Bob | 11   | 
+--------+--------------+ 
| Lisa | 12   | 
+--------+--------------+ 

Расчет 85-й процентиль для возраста в наборе будет просто сделать с помощью: percentile_cont(0.85) WITHIN group (ORDER BY age asc) 85

Теперь у нас есть мощность для каждого имени (количество людей с этим конкретным именем). Это выглядит примерно так:

+--------------+--------+ 
| name | age | count | 
+--------+-----+--------+ 
| Joe | 10 | 2 | 
+--------+-----+--------+ 
| Bob | 11 | 1 | 
+--------+-----+--------+ 
| Lisa | 12 | 1 | 
+--------+-----+--------+ 

Есть ли способ использовать percentile_cont или любой другой встроенный в функции в Postgres вычислить процентиль, принимая на счета/мощность во внимание?

ответ

0

Наиболее очевидным решением является дублирование строк в соответствии с count.

Пример данных:

create table a_table (name text, age int, count int); 
insert into a_table values 
    ('Joe', 10, 3), 
    ('Bob', 11, 2), 
    ('Lisa', 12, 1); 

Запрос:

with recursive data (name, age, count) as (
    select * 
    from a_table 
union all 
    select name, age, count- 1 
    from data 
    where count > 1 
    ) 
select name, age 
from data 
order by 1, 2; 

name | age 
------+----- 
Bob | 11 
Bob | 11 
Joe | 10 
Joe | 10 
Joe | 10 
Lisa | 12 
(6 rows) 
Смежные вопросы