2015-08-18 5 views
0

Я хотел бы рассчитать темп роста для клиентов для следующих данных.Postgres рассчитывает прирост в течение двух месяцев

month   | customers 
------------------------- 
01-2015  | 1 
02-2015  | 10 
03-2014  | 10 
06-2015  | 15 

Я использовал следующую формулу для расчета скорости роста, он работает только в течение одного месяца интервала, а также не в состоянии дать ожидаемого результата из-за разрыва между 3-й и 6-й месяц, как показано в таблице выше

select 
    month, total, 
    (total::float/lag(total) over (order by month) - 1) * 100 growth 
from (
    select to_char(created, 'yyyy-mm') as month, count(id) total 
    from customers 
    group by month 
) s 
order by month; 

Я думаю, что это можно сделать, создав диапазон дат и группу по этому диапазону.

Я ожидаю, что два основных выхода отдельно 1) Сгенерируйте темп роста с точной разницей в один месяц 2) Темп роста с интервалом в 2 месяца вместо одного месяца. В приведенных выше данных суммируйте двухмесячный результат и группу на два месяца вместо месяца

+0

чем вопрос .. –

+0

@VaoTsun Вопрос в том, как рассчитать эффективный и правильный темп роста со всеми месячными интервалами без пропуска в любой месяц – ram

+0

В какой-то момент вы также можете найти статистические агрегированные функции для расчета линейной регрессии, например: http://www.postgresql.org/docs/9.0/стат ic/functions-aggregate.html –

ответ

0

По-прежнему не уверен в отношении второй части. Вот рост с вашего адаптированной запроса и роста twon месяц колонки:

select 
    month, total, 
    (total::float/lag(total) over (order by m) - 1) * 100 growth,m,m2 
from (
    select created, (sum(customers) over (order by m))::float total,customers,m,m2,to_char(created, 'yyyy-mm') as month 
    from customers c 
    right outer join (
     select generate_series('2015-01-01','2015-06-01','1 month'::interval) m 
    ) m1 on m=c.created 
    left outer join (
     select generate_series('2015-01-01','2015-06-01','2 month'::interval) m2 
    ) m2 on m2=m 
    order by m 
) s 
order by m; 

enter image description here

в основном ответ является использование generate_series

+0

Второй момент: я хочу генерировать темпы роста для двухмесячной группировки вместо одного месяца, то есть, FIrst и другие точки различны И они откладывают с точки зрения периода роста, сначала у меня есть один месяц, а во втором, который заменяется на два месяца – ram

+0

На приведенном выше изображении результата вы показываете всего 21 на 4-й и 5-й месяц, что должно быть 0, а вы не думаете? В первый месяц у меня 1 клиент, на втором я получил 10 аналогично, у меня 10 клиентов для третьего Но, похоже, у вас есть сумма с предыдущим, можете ли вы объяснить свой запрос? – ram

+0

всего в моем запросе общее количество клиентов - почему он упадет до нуля, когда не вырастет? .. рост падает на своем ходу ... @ram Позволяет сделать другой путь - поместите стол с ожидаемыми результатами на ваш вопрос:) –

Смежные вопросы