SQL - Расчет годового роста для ежемесячной доходности - PullRequest
0 голосов
/ 31 марта 2019

У меня есть таблица с ежемесячными данными в виде:

Date | Value
2018-06 | 100
2018-07 | 105
2017-06 | 90
2017-07 | 92

Как лучше всего взять эти данные и рассчитать годовой доход за каждый месяц? Я бы хотел, чтобы это выглядело так:

Date | YoY growth
2018-06 | 0.11111
2018-07 | 0.1413

Ответы [ 2 ]

0 голосов
/ 31 марта 2019

Я бы просто проанализировал дату и использовал lag():

select date, value, prev_value,
       (value - prev_value) / prev_value as YOY_growth
from (select t.*,
             lag(value) over (partition by right(date, 2)
                              order by left(date, 4)
                             ) as prev_value
      from t
     ) t
where prev_value is null
0 голосов
/ 31 марта 2019

Используйте DISTINCT ON month, чтобы выбрать только месяцы. Затем используйте функцию управления окнами LEAD в обратном списке (через ORDER BY d DESC), чтобы получить год, предшествующий текущему году

Тест в реальном времени: http://sqlfiddle.com/#!17/5be39/2

select
    distinct on ( date_part('month', (d || '-01')::date) )  -- get the months only

    -- ORDER BY d DESC sort the list from most recent to oldest.
    -- so LEAD here actually refers to previous year

    d,
    v,               
    lead(v) over(partition by date_part('month', (d || '-01')::date) order by d desc), 

    ( v / lead(v) over(partition by date_part('month', (d || '-01')::date) order by d desc) )
    - 1 as YoyGrowth


from progress

Выход:

|       d |   v | lead |          yoygrowth |
|---------|-----|------|--------------------|
| 2018-06 | 100 |   90 | 0.1111111111111111 |
| 2018-07 | 105 |   92 |  0.141304347826087 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...